
我已經在這裡和其他一些地方搜尋過,試圖找到這個問題的答案,但它似乎太簡單了,以至於沒有人回答它。我需要做的就是在新列中將單一值新增到每行的末尾。我發現的最接近的是使用sed -i "s/$/green/" ./test.txt
,但這會將綠色值添加到下一行,我需要將其添加為當前最後一列之後的新列
我有一個這樣的文件:
chr - xyz ordered_A01 5480 6144
chr - xyz ordered_A01 5480 58001
我需要它看起來像這樣:
chr - xyz ordered_A01 5480 6144 green
chr - xyz ordered_A01 5480 58001 green
但我得到的是這個:
chr - xyz ordered_A01 5480 6144
green
chr - xyz ordered_A01 5480 5801
green
答案1
您問題中的 sed 命令實際上是正確的。如果您在新行上看到結果,則表示您的終端設定為窄,並且只是看到了換行,或者您的實際環境中包含了本範例中未向我們展示的程式碼。它按原樣工作,但您應該注意兩個問題:
$
在雙引號字串內用作表達式的一部分是危險的。通常它會擴展為 bash 變數。在這種情況下,您逃脫了它,因為它/
後面的字元不是有效的有價值的名稱,但為了避免這種情況,您確實應該在表達式周圍使用單引號。如果您想將內容作為列對齊,您可能應該在行尾和要新增的值之間包含某種分隔符號。製表符可能是執行此操作的最簡單方法,但您可能應該使用其他欄位之間已有的任何分隔符號。
組合起來,固定命令可能看起來像這樣:
sed -i 's/$/\tgreen/' ./test.txt
如果結果沒有按照您想要的方式排列,您可能會考慮透過管道傳輸資料col
來排列列。
至於您沒有向我們展示的內容,問題可能出在您的資料檔案中。既然您在評論中提到了寫字板和 Excel。我猜你有一個混合的 Windows/Unix 環境。我懷疑問題是您的資料檔案在行尾之前有垃圾非列印序列。你應該做點什麼來清理它。一個簡單的sed 's/\s*$//'
可能是一個開始的地方(除了最後一個換行符之外,在行末尾去除所有空白字符),但是像 dos2unix 轉換器這樣的更高級的系統可能會給你更好的結果。如果你有二進位垃圾,並且文件應該是 ASCI 文本,你可以嘗試用tr -cd '\11\12\15\40-\176'
.
答案2
你可以使用awk
:
awk '{printf "%s", $0 "\tgreen\n"}' infile > outfile
答案3
您可以在 Ex 模式下使用 Vim:
ex -sc '%s/$/\tgreen/|x' test.txt
%
選擇所有行\t
標籤x
儲存並關閉