當只有一列時,如何新增列(最好使用 sed -i)?

當只有一列時,如何新增列(最好使用 sed -i)?

假設我有一列這樣的數據:

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」一樣)」。

相關內容