for-loop - Linux - 循环遍历每行上的每个元素
问题描述
我有一个包含以下信息的文本文件:
cat test.txt
a,e,c,d,e,f,g,h
d,A,e,f,g,h
我希望遍历每一行,然后为每一行打印与 e 不同的所有字符的索引。所以理想的输出是使用制表符分隔符或逗号分隔符
1 3 4 6 7 8
1 2 4 5 6
or
1,3,4,6,7,8
1,2,4,5,6
我设法遍历每一行并打印索引,但结果是打印到同一行而不是分开的。
while read line;do echo "$line" | awk -F, -v ORS=' ' '{for(i=1;i<=NF;i++) if($i!="e") {print i}}' ;done<test.txt
结果是
1 3 4 6 7 8 1 2 4 5 6
如果我只使用 awk
awk -F, -v ORS=' ' '{for(i=1;i<=NF;i++) if($i!="e") {print i}}'
我得到相同的输出
任何人都可以帮助我解决分隔线的具体问题。
解决方案
如果你不介意一些尾随空格,你可以这样做:
while read line;do echo "$line" | awk -F, '{for(i=1;i<=NF;i++) if($i!="e") {printf i " "}; print ""}' ;done<test.txt
但是省略while循环并执行以下操作会更典型:
awk -F, '{for(i=1;i<=NF;i++) if($i!="e") {printf i " "}; print ""}' <test.txt
您可以通过略显神秘的方式避免尾随空格:
awk -F, '{m=0; for(i=1;i<=NF;i++) if($i!="e") {printf "%c%d", m++ ? " " : "", i }; print ""}' <test.txt
推荐阅读
- websocket++ - 在 run() 但在处理程序之外会发生什么?/ send() 应该放在哪里?
- ckan - 防止匿名访问 CKAN 站点的方法
- javascript - 当将在 odoo 中进行销售时,如何向折扣添加限制规则?
- java - 为什么有些方法没有找到,即使已经包含了导入?
- flutter - 无法将 request.auth.id 与 Firestore 规则中的文档 ID 匹配
- jquery - jQuery在每个循环中添加元素
- javascript - 如何将内容添加到 div
- java - 带有拦截器的 Spring Websocket 在连接关闭时执行 preSend
- kubernetes - Kubernetes liveness 探针是否支持使用 PKI 进行用户身份验证?
- android - 如何在不更改“AppTheme”中的“colorAccent”的情况下更改TextInputLayout和光标的浮动标签颜色