当只有一列时,如何向文件添加列(最好使用 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”一样)”。

相关内容