我有一个制表符分隔的文件,有 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
。