如何在unix中每行的末尾添加文本

use*_*888 30 unix shell awk ksh

我正在进行某些文本处理操作,最终能够获得这样的文件

india
sudan
japan
france
Run Code Online (Sandbox Code Playgroud)

现在我想在上面的文件中添加注释,就像在最终文件中它应该是类似的

india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
Run Code Online (Sandbox Code Playgroud)

像整个文件中的相同评论.我该怎么做呢?

fed*_*qui 59

有很多方法:

sed:用$给定的文本替换(行尾).

$ sed 's/$/ | COUNTRY/' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
Run Code Online (Sandbox Code Playgroud)

awk:打印行加上给定的文本.

$ awk '{print $0, "| COUNTRY"}' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
Run Code Online (Sandbox Code Playgroud)

最后,在pure中bash:逐行读取并将其与给定文本一起打印.请注意,这是不鼓励的,如为什么使用shell循环来处理被视为不良做法的文本?

$ while IFS= read -r line; do echo "$line | COUNTRY"; done < file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY
Run Code Online (Sandbox Code Playgroud)

  • 所有解决方案都有效,假设线路以换行符结束("\n").我有一个来自Windows的文件,带有回车和换行符("\ r \n"),我在行的开头得到了所需的注释.我刚用dos2unix转换文件,所有解决方案都运行正常. (3认同)

Jot*_*tne 5

其他 awk

awk '$0=$0" | COUNTRY"' file
Run Code Online (Sandbox Code Playgroud)

  • 只是为了好玩,我将性能与 20M 行文件进行了比较。`time awk '{print $0, "| COUNTRY"' a &amp;&gt;/dev/null` 大约需要 0.003 秒,而 `time awk '$0=$0" | COUNTRY"' a &amp;&gt;/dev/null` 大约需要 4.03 秒. 我猜这项任务会消耗更多的额外时间。 (3认同)
  • 我没有得到这个正常运行...我明白了 | COUNTRY 在行的开头...为什么会这样? (2认同)