Search code examples
bashunixcut

Cut unix variable


I have the following at the moment:

for file in *
  do
  list="$list""$file "`cat $file | wc -l | sort -k1`$'\n'
  done

echo "$list"

This is printing:

fileA 10
fileB 20
fileC 30

I would then like to cycle through $list and cut column 2 and perform calculations.

When I do:

for line in "$list"
  do
     noOfLinesInFile=`echo "$line" | cut -d\  -f2`
     echo "$noOfLinesInFile"
  done

It prints:

10
20
30

BUT, the for loop is only being entered once. In this example, it should be entering the loop 3 times.

Can someone please tell me what I should do here to achieve this?


Solution

  • If you quote the variable

    for line in "$list"
    

    there is only one word, so the loop is executed just once.

    Without quotes, $line would be populated with any word found in the $list, which is not what you want, either, as it would process the values one by one, not lines.

    You can set the $IFS variable to newline to split $list on newlines:

    IFS=$'\n'
    for line in $list ; do
       ...
    done
    

    Don't forget to reset IFS to the original value - either put the whole part into a subshell (if no variables should survive the loop)

    (
      IFS=$'\n'
      for ...
    )
    

    or backup the value:

    IFS_=$IFS
    IFS=$'\n'
    for ...
        IFS=$IFS_
        ...
    done