假設我有一列這樣的數據:
sample123
sample456
samplexyz
我可以使用以下方法輕鬆新增兩個新列:
sed -i "s/$/\t1.1\tC/" <file.txt>
現在是:
sample123 1.1 C
sample456 1.1 C
samplexyz 1.1 C
現在假設我在底部附加一些新數據:
sample123 1.1 C
sample456 1.1 C
samplexyz 1.1 C
sampleNew1
sampleNew2
sampleNew3
如果我嘗試附加此資料的新列,它會附加到所有行,所以現在當我運行時:
sed -i "s/$/\t1.2\tA/" <file.txt>
看起來像:
sample123 1.1 C 1.2 A
sample456 1.1 C 1.2 A
samplexyz 1.1 C 1.2 A
sampleNew1 1.2 A
sampleNew2 1.2 A
sampleNew3 1.2 A
如何新增除第一列之外沒有其他列的列?
答案1
首先測試目前行是否有製表符,如果沒有則僅進行替換:
sed -i '/\t/!s/$/\t1.2\tA/' file
在這裡,我們使用所有不包含製表符的行/\t/!
並將替換應用於這些行。
上面假設 GNUsed
能夠辨識\t
製表符。其他sed
實作可能需要使用文字製表符來代替\t
。其他sed
實作也可能以-i
與 GNU 不同的方式處理該選項sed
(請參閱“如何使用 sed -i (就地編輯)實現可移植性?”)。
使用awk
:
awk -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
這將測試製表符分隔字段的數量,如果只有一個字段,它將在列印該行之前添加新的第二個和第三個字段。
這不會就地更改文件。為此,請awk
像這樣使用 GNU:
awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
有關awk
就地編輯的更多信息,請參閱“如何使用 awk 永久更改檔案? (「就地」編輯,與「sed -i」一樣)」。