【发布时间】:2014-05-29 12:33:03
【问题描述】:
我正在做某些文本处理操作,终于能够得到一个像这样的文件
india
sudan
japan
france
现在我想在上面的文件中添加注释,就像在最终文件中一样,它应该是
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
喜欢整个文件中的相同评论。我该怎么做?
【问题讨论】:
我正在做某些文本处理操作,终于能够得到一个像这样的文件
india
sudan
japan
france
现在我想在上面的文件中添加注释,就像在最终文件中一样,它应该是
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
喜欢整个文件中的相同评论。我该怎么做?
【问题讨论】:
有很多方法:
sed:将$(行尾)替换为给定的文本。
$ sed 's/$/ | COUNTRY/' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
awk:打印行加上给定的文本。
$ awk '{print $0, "| COUNTRY"}' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
最后,纯bash:逐行读取并与给定文本一起打印。请注意,不鼓励这样做,如 Why is using a shell loop to process text considered bad practice?
$ while IFS= read -r line; do echo "$line | COUNTRY"; done < file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
【讨论】:
\r),因此,你必须在那里写 sed 's/\r/ | COUNTRY/' file。
另一个awk
awk '$0=$0" | COUNTRY"' file
【讨论】:
time awk '{print $0, "| COUNTRY"' a &>/dev/null 大约需要 0.003 秒,而 time awk '$0=$0" | COUNTRY"' a &>/dev/null 大约需要 4.03 秒。我猜这个任务会消耗更多的额外时间。
对于更模糊的方法:
yes '| COUNTRY' | sed $(wc -l < file)q | paste -d ' ' file -
【讨论】:
paste 工具非常快,即使对于大 (>20MB) 测试文件也是如此。
-d 选项,paste 默认使用制表符连接。您可以将空格移动到| 之前,但您仍然需要-d '' 来取消制表符。
您也可以为此使用xargs 和echo:
< file xargs -d "\n" -rI % echo '% | COUNTRY'
这将使xargs 获取file 的每一行并一次将其传递给指定的echo 命令,用输入行替换%(或您选择的任何字符)。
† 默认情况下,xargs 会将多行输入传递给单个命令,并将它们全部附加到其参数列表中。但是指定-I % 会使xargs 将输入放在命令中的指定位置,并且一次只放一行,根据需要运行echo。
【讨论】: