【问题标题】:Inserting delimiters (comma) in space separated file every n columns using awk使用 awk 每 n 列在空格分隔的文件中插入分隔符(逗号)
【发布时间】:2018-06-19 12:41:30
【问题描述】:

我正在尝试在 2 的倍数列之间插入两个逗号。例如,对于以下输入文件,我正在尝试在列 b 和 c & d 和 e 之间打印 2 个逗号:-

a b c d e
f g h i j
k l m n o

输出应该是这样的:-

a b , , c d , , e

以下代码是我目前所拥有的。请注意,我也有模式匹配,因此是/a/。我使用for 循环来打印带有if 语句的逗号,该语句应该每两列打印两个逗号,这就是模的用途:- :-

awk '/a/{for (i = 1; i <= NF; i++) printf $i" "; if ((i%2)==0) printf " , ,"}' test.txt > blabla.txt

结果如下。我的for 循环和模式匹配工作得很好,但由于某种原因,if 语句没有被执行,我不知道为什么:-

a b c d e , ,

任何帮助或更好的选择将不胜感激。提前致谢!

【问题讨论】:

    标签: awk delimiter


    【解决方案1】:

    您可以通过更改初始索引和增量值来修改所有其他元素

    $ awk '/a/{for(i=2; i<=NF; i+=2) $i = $i " , ,"; print}' test.txt
    a b , , c d , , e
    
    • 拥有i=2i+=2 可避免手动检查字段是否为偶数。循环迭代将是 2、4、6 等而不是 1、2、3、4 等
    • $i = $i " , ," 会将给定的字符串附加到字段
    • print 这将打印$0 的内容,使用OFS(输出字段分隔符)作为连接字段的字符串(默认OFS 是单个空格字符)
    • 延伸阅读:gawk manual - Changing the Contents of a Field


    在您的尝试中,您希望在 for 循环中有多个语句。为此,您需要将它们放在{}

    $ awk '/a/{for (i = 1; i <= NF; i++) printf $i" "; if ((i%2)==0) printf " , ,"}' ip.txt
    a b c d e  , ,
    
    $ awk '/a/{for (i = 1; i <= NF; i++) { printf $i" "; if ((i%2)==0) printf " , ," } }' ip.txt
    a b  , ,c d  , ,e 
    

    但这仍然是低效的 - 除了第二个逗号后缺少空格外,最后一列之后还有额外的空格。而且也没有换行符,这可能是个问题

    【讨论】:

    • 你的作品!谢谢!您介意解释为什么选择从 2 开始索引,以及 $i = $i 的作用吗?谢谢!
    【解决方案2】:

    这个 sed 单线可能会有所帮助:

     sed -r 's/\s\S\s/&, , /g' file
    

    只替换包含a的行:

    sed -r '/a/s/\s\S\s/&, , /g' file
    

    例如:

    kent$  sed -r 's/\s\S\s/&, , /g' <<<"a b c d e"
    a b , , c d , , e  
    

    【讨论】:

    • 会试试这个。我以前从未真正使用过 sed,但它看起来比 awk 短得多。谢谢!
    • 请注意,\s 是不可移植的,并且该解决方案是针对单个字符字段的。-E-r 更便携,并且无论如何都不需要在这里。另外,OP 想要只打印具有a 的行,所以它应该是sed -n '/a/s/\s\S\s/&amp;, , /gp'
    • @Sundeep 哦,如果 OP 只需要打印 a 行,是的,需要 -np
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2014-05-24
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2013-11-14
    相关资源
    最近更新 更多