1

我正在尝试一次将一个 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 complex code.... 部分放置另一个循环和 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
4

3 回答 3

4

You can use the IFS internal field separator to use a comma (instead of whitespace) and do the assignments in a while loop:

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

IFS=$SAVEIFS;

This will save a copy of your current IFS, change it to a , character, and then iterate over each line in your file. The line set -- $line; will convert each word (separated by a comma) into a numeric-variable ($1, $2, etc.). You can either use these variables directly, or assign them to other (more meaningful) variable names.

Alternatively, you could use IFS with the answer provided by William:

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

They are functionally identical and it just comes down to whether or not you want to explicitly set var1=$1 or have it defined in the while-loop's head.

于 2012-10-05T04:50:18.703 回答
4

你为什么要使用awk

while IFS=, read var1 var2 var3; do
  ...
done < file.txt
于 2012-10-05T04:33:59.603 回答
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 或 undefined ?

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

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

于 2012-10-05T10:20:01.587 回答