追加一列

追加一列

我已經在這裡和其他一些地方搜尋過,試圖找到這個問題的答案,但它似乎太簡單了,以至於沒有人回答它。我需要做的就是在新列中將單一值新增到每行的末尾。我發現的最接近的是使用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 命令實際上是正確的。如果您在新行上看到結果,則表示您的終端設定為窄,並且只是看到了換行,或者您的實際環境中包含了本範例中未向我們展示的程式碼。它按原樣工作,但您應該注意兩個問題:

  1. $在雙引號字串內用作表達式的一部分是危險的。通常它會擴展為 bash 變數。在這種情況下,您逃脫了它,因為它/後面的字元不是有效的有價值的名稱,但為了避免這種情況,您確實應該在表達式周圍使用單引號。

  2. 如果您想將內容作為列對齊,您可能應該在行尾和要新增的值之間包含某種分隔符號。製表符可能是執行此操作的最簡單方法,但您可能應該使用其他欄位之間已有的任何分隔符號。

組合起來,固定命令可能看起來像這樣:

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
  1. %選擇所有行

  2. \t標籤

  3. x儲存並關閉

相關內容