假设我有一列这样的数据:
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”一样)”。