Linux - 循环遍历每一行的每个元素

RAH*_*sen 2 awk grep for-loop

我有一个包含以下信息的文本文件:

cat test.txt
a,e,c,d,e,f,g,h
d,A,e,f,g,h
Run Code Online (Sandbox Code Playgroud)

我希望遍历每一行,然后为每一行打印与 e 不同的所有字符的索引。所以理想的输出要么是制表符分隔符,要么是逗号分隔符

1 3 4 6 7 8
1 2 4 5 6

or

1,3,4,6,7,8
1,2,4,5,6
Run Code Online (Sandbox Code Playgroud)

我设法遍历每一行并打印索引,但结果被打印到同一行而不是分开的。

while read line;do echo "$line" | awk -F, -v ORS=' ' '{for(i=1;i<=NF;i++) if($i!="e") {print i}}' ;done<test.txt
Run Code Online (Sandbox Code Playgroud)

结果是

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}}'

我得到相同的输出

任何人都可以通过分隔线来帮助我解决这个特定问题。

Wil*_*ell 5

如果你不介意一些尾随空格,你可以这样做:

while read line;do echo "$line" | awk -F, '{for(i=1;i<=NF;i++) if($i!="e") {printf i " "}; print ""}' ;done<test.txt
Run Code Online (Sandbox Code Playgroud)

但省略while循环并执行以下操作会更典型:

awk -F, '{for(i=1;i<=NF;i++) if($i!="e") {printf i " "}; print ""}' <test.txt
Run Code Online (Sandbox Code Playgroud)

您可以通过稍微神秘的方式避免尾随空格:

awk -F, '{m=0; for(i=1;i<=NF;i++) if($i!="e") {printf "%c%d", m++ ? " " : "", i }; print ""}' <test.txt
Run Code Online (Sandbox Code Playgroud)

  • @accdias 正确。使用输入重定向的优点是,如果您还将输出重定向到文件,例如“awk 'script' &lt;input &gt;output”,那么如果无法打开输入,则不会创建/清空输出。缺点是 FILENAME 变量中没有输入文件的名称。恕我直言,专业版通常不值得为 1 个输入文件而使用它,并且在有多个输入文件的常见情况下您不能使用它,因此不值得使用它,除非您有非常具体的需要,例如您绝对需要这样做如果无法打开单个输入文件,则不得 zap 输出文件。 (3认同)