如何向现有列添加单词

如何向现有列添加单词

我有一个制表符分隔的文件,有 10 列,在其中一列(大约有 4000 万行)中,我想在每行中的现有条目之前添加一个单词(每行中的相同单词!)并在;条目之后添加一个。

例如前两行

1 2 3 4 5 6 7 8 text still more text in this column 10
1 2 3 4 5 6 7 8 text2 still more text in this column 10

1 2 3 4 5 6 7 8 test=text; still more text in this column 10
1 2 3 4 5 6 7 8 test=text2; still more text in this column 10

归根结底,这是 Excel 中基本的“连接”功能,但我无法将 Excel 用于如此大的文件,而且无论如何也需要迁移到 Linux。

我在论坛上研究了串联问题,但我只找到了涉及合并两个字符串的主题,例如。

foo="Hello"
foo="$foo World"
echo $foo  

但不使用变量。

答案1

这正是awk擅长:

awk -F'\t' -vOFS='\t' '{ $9 = "test=" $9 ";" }1'

-F'\t'告诉它使用制表符分隔的字段。-vOFS='\t'告诉它在输出中也使用制表符。它的实际主体是最后一个参数:它是一个小程序,表示每一行将(第九个字段)的值更改$9为“test=”、其原始值和“;”的串联。我们保留所有其他字段不变,最后1是告诉awk打印新行,即使我们对其做了一些操作。

如果我给它你的输入(插入标签):

$ cat data
1   2   3   4   5   6   7   8   text    still more text in this column 10
1   2   3   4   5   6   7   8   text2   still more text in this column 10

然后我可以运行上面的命令:

$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data
1   2   3   4   5   6   7   8   test=text;  still more text in this column 10
1   2   3   4   5   6   7   8   test=text2; still more text in this column 10

并得到你想要的输出。您可以将其保存到带有重定向的文件中>

$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data > processed-data

答案2

使用 GNU sed

sed 's/[^\t]*/text=&;/9'

即,将第 9 个非制表符序列替换为text=&;(其中&表示匹配部分)。

在具有其他实现的系统上sed,您可能需要按字面输入制表符而不是\t

相关内容