而read循环只处理第一行;

时间:2014-04-17 01:26:45

标签: bash while-loop

我有一个包含多行的文件,并希望对每一行执行以下操作..

  1. 从awk输出设置三个变量。
  2. 使用可变数据执行某些操作(在我的示例中,回显它们)。
  3. 我的脚本成功完成了我想要的操作,但只适用于文件的第一行。

    #!/bin/bash
    
    while read LINE; do
    set -- $(awk -F";" '{print $1, $2, $3}')
    var1=$1
    var2=$2
    var3=$3
    
    echo $1
    echo $2
    echo $3
    
    done < /path/file
    

    文件数据样本:

    NPK;20140325;272128;4579
    NPK;20140329;272826;4977
    NPK;20140320;271832;4248
    NPK;20140415;273213;6698
    NPK;20140406;272703;5708
    NPK;20140408;272204;5811
    NPK;20140324;271966;4465
    NPK;20140401;272507;5253
    NPK;20140403;272638;5487
    

    有什么想法吗?

    欢呼M

1 个答案:

答案 0 :(得分:3)

您的awk语句没有明确的输入,因此它会消耗stdin输入的其余部分 - 输入文件的其余行。

您必须明确地将$LINE变量传递给awk命令,您可以使用here-string进行操作,即<<< $LINE

while read LINE; do

  set -- $(awk -F";" '{print $1, $2, $3}' <<< $LINE)
  var1=$1
  var2=$2
  var3=$3

  echo $1
  echo $2
  echo $3

done < /path/file

但是,通过让read进行所有解析,您可以大大简化循环:

while IFS=\; read var1 var2 var3 unused; do

  echo $var1
  echo $var2
  echo $var3

done < /path/file