一次将多个字段设置为awk变量

时间:2012-10-05 04:31:53

标签: bash awk

我正在尝试将awk变量字段一次设置为多个字段。

现在我只能逐个设置变量。

for line in `cat file.txt`;do
    var1=`echo $line | awk -F, '{print $1}'`
    var2=`echo $line | awk -F, '{print $2}'`
    var3=`echo $line | awk -F, '{print $3}'`

    #Some complex code....
done

我认为这很昂贵,因为它会多次解析linux变量。是否有一种特殊的语法来一次设置变量?我知道awk有一个BEGIN和END块,但我试图避免BEGIN和END块的原因是为了避免嵌套的awk。

我计划在#Some复杂代码......中添加另一个循环和awk代码。

for line in `cat file.txt`;do
    var1=`echo $line | awk -F, '{print $1}'`
    var2=`echo $line | awk -F, '{print $2}'`
    var3=`echo $line | awk -F, '{print $3}'`

    for line2 in `cat file_old.txt`;do
        vara=`echo $line2 | awk -F, '{print $1}'`
        varb=`echo $line2 | awk -F, '{print $2}'`

        # Do comparison of $var1,var2 and $vara,$varb , then do something with either
    done
done

3 个答案:

答案 0 :(得分:4)

您可以使用IFS内部字段分隔符来使用逗号(而不是空格)并在while循环中执行分配:

SAVEIFS=$IFS;
IFS=',';
while read line; do
    set -- $line;
    var1=$1;
    var2=$2;
    var3=$3;
    ...
done < file.txt

IFS=$SAVEIFS;

这将保存当前IFS的副本,将其更改为,字符,然后迭代文件中的每一行。行set -- $line;会将每个单词(以逗号分隔)转换为数字变量($1$2等)。您可以直接使用这些变量,也可以将它们分配给其他(更有意义的)变量名称。

或者,您可以将IFS与William提供的答案一起使用:

IFS=',';
while read var1 var2 var3; do
    ...
done < file.txt

它们在功能上是相同的,它只取决于您是否要明确设置var1=$1或在while - 循环的头部定义它。

答案 1 :(得分:3)

你为什么要使用awk

while IFS=, read var1 var2 var3; do
  ...
done < file.txt

答案 2 :(得分:0)

#!/bin/bash    
FILE="/tmp/values.txt"

    function parse_csv() { 
    local lines=$lines;
    > $FILE
    OLDIFS=$IFS;
    IFS=","
    i=0
    for val in ${lines}
    do
      i=$((++i))
      eval var${i}="${val}"
    done
    IFS=$OLDIFS;
    for ((j=1;j<=i;++j))
    do
      name="var${j}"
      echo ${!name} >> $FILE
    done

    }

    for lines in `cat file_old.txt`;do
     parse_csv;
    done

您所描述的问题只有3个值,3个值是否有可能不同且是4或5还是未定义?

如果是这样,上面将逐行解析csv,并在名为/tmp/values.txt的文件中的新行上一次输出每个值

随意修改以符合您的要求,它比定义3个值更具动态性