如何在unix中的每一行末尾添加文本
Posted
技术标签:
【中文标题】如何在unix中的每一行末尾添加文本【英文标题】:How to add text at the end of each line in unix 【发布时间】:2014-05-29 12:33:03 【问题描述】:我正在做某些文本处理操作,终于能够得到一个像这样的文件
india
sudan
japan
france
现在我想在上面的文件中添加注释,就像在最终文件中一样,它应该是
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
喜欢整个文件中的相同评论。我该怎么做?
【问题讨论】:
【参考方案1】:有很多方法:
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
【讨论】:
假设行以换行符(“\n”)结尾,所有解决方案都有效。我有一个来自 Windows 的文件,带有回车符和换行符(“\r\n”),我在行首得到了所需的注释。我刚刚用 dos2unix 转换了文件,所有解决方案都可以正常工作。 MacOS 只使用回车 (\r
),因此,你必须在那里写 sed 's/\r/ | COUNTRY/' file
。【参考方案2】:
另一个awk
awk '$0=$0" | COUNTRY"' file
【讨论】:
我也想过这个,这可能是最短的awk解决方案... +1 只是为了好玩,我将性能与 20M 行文件进行了比较。time awk 'print $0, "| COUNTRY"' a &>/dev/null
大约需要 0.003 秒,而 time awk '$0=$0" | COUNTRY"' a &>/dev/null
大约需要 4.03 秒。我猜这个任务会消耗更多的额外时间。
@fedorqui 有趣。短并不总是最好的:)
@Jotne 确实,我没想到会有这样的结果。但当然,这是一个极端情况,你的答案是完全有效的。
我无法正常运行...我明白了 | COUNTRY 在该行的开头...为什么呢?【参考方案3】:
对于更模糊的方法:
yes '| COUNTRY' | sed $(wc -l < file)q | paste -d ' ' file -
【讨论】:
附带说明,在我的测试中,paste
工具非常快,即使对于大 (>20MB) 测试文件也是如此。
@00prometheus:没有-d
选项,paste
默认使用制表符连接。您可以将空格移动到|
之前,但您仍然需要-d ''
来取消制表符。
你是对的。我删除了我的评论以避免误导任何人。【参考方案4】:
您也可以为此使用xargs
和echo
:
< file xargs -d "\n" -rI % echo '% | COUNTRY'
这将使xargs
获取file
的每一行并一次将其传递给指定的echo
命令,用输入行替换%
(或您选择的任何字符)。
† 默认情况下,xargs
会将多行输入传递给单个命令,并将它们全部附加到其参数列表中。但是指定-I %
会使xargs
将输入放在命令中的指定位置,并且一次只放一行,根据需要运行echo
。
【讨论】:
以上是关于如何在unix中的每一行末尾添加文本的主要内容,如果未能解决你的问题,请参考以下文章