gpt4 book ai didi

awk - 使用 awk 在每 n 列的空格分隔文件中插入分隔符(逗号)

转载 作者:行者123 更新时间:2023-12-03 03:37:55 24 4
gpt4 key购买 nike

我尝试在 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 '/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 这将使用 OFS(输出字段分隔符)作为连接字段的字符串打印 $0 的内容(默认 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

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

关于awk - 使用 awk 在每 n 列的空格分隔文件中插入分隔符(逗号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50928736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com