【问题标题】:How to add text at the end of each line in unix如何在unix中的每一行末尾添加文本
【发布时间】:2014-05-29 12:33:03
【问题描述】:

我正在做某些文本处理操作,终于能够得到一个像这样的文件

india
sudan
japan
france

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

india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

喜欢整个文件中的相同评论。我该怎么做?

【问题讨论】:

    标签: shell unix awk ksh


    【解决方案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 &amp;&gt;/dev/null 大约需要 0.003 秒,而 time awk '$0=$0" | COUNTRY"' a &amp;&gt;/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】:

    您也可以为此使用xargsecho

    < file xargs -d "\n" -rI % echo '% | COUNTRY'
    

    这将使xargs 获取file 的每一行并一次将其传递给指定的echo 命令,用输入行替换%(或您选择的任何字符)。

    † 默认情况下,xargs 会将多行输入传递给单个命令,并将它们全部附加到其参数列表中。但是指定-I % 会使xargs 将输入放在命令中的指定位置,并且一次只放一行,根据需要运行echo

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多