Wednesday, December 29, 2021

[SOLVED] Linux - loop trough each element on each line

Issue

I have a text file with the following information:

cat test.txt
a,e,c,d,e,f,g,h
d,A,e,f,g,h

I wish to iterate through each line and then for each line print the index of all the characters different from e. So the ideal output would be either with a tab seperator or comma seperator

1 3 4 6 7 8
1 2 4 5 6

or

1,3,4,6,7,8
1,2,4,5,6

I have managed to iterate through each line and print the index, but the results are printet to the same line and not seperated.

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

With the result being

1 3 4 6 7 8 1 2 4 5 6

If i do it only using awk awk -F, -v ORS=' ' '{for(i=1;i<=NF;i++) if($i!="e") {print i}}'

I get the same output

Could anyone help me with this specific issue with seperating the lines.


Solution

If you don't mind some trailing whitespace, you can just do:

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

but it would be more typical to omit the while loop and do:

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

You can avoid the trailing whitespace with the slightly cryptic:

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


Answered By - William Pursell