1

awk変数フィールドを一度に複数のフィールドに設定しようとしています。

現在、変数を1つずつ設定することしかできません。

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
4

3 に答える 3

4

なんで使ってるawkの?

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

于 2012-10-05T04:50:18.703 に答える
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を1行ずつ解析し、/ tmp/values.txtというファイルの新しい行に一度に各値を出力します。

要件に合わせて、3つの値を定義するよりもはるかに動的に変更してください。

于 2012-10-05T10:20:01.587 に答える