3

私はawkを使用して、3、$ 3のフィールド位置で入力を読み取ろうとしています。フィールド3は、文字列です。

awk -F'","' '{print $1}'  input.txt

私のファイルinput.txtは次のようになります

field1,field2,field3,field4,field5

問題は、これらのフィールドがコンマで区切られていることです。一部は二重引用符で囲まれていますが、そうでないものもあります。また、フィールド5は二重引用符で囲まれており、あらゆる種類の記号が含まれています。例:

imfield1,imfield2,"imfield3",imfield4,"im"",""fi"",el,""d5"

awkはこのような状況に対処できますか?もっと詳しく言えば、typIng $ 5で文字列全体を取得するにはどうすればよいですか?

4

3 に答える 3

3

LoranceStinsonのAwkCSVパーサーを使用できます。この場合、次のように簡単です。

function parse_csv(..) {
    ..
}

{
    num_fields = parse_csv($0, csv, ",", "\"", "\"", "\\n", 1);
    print csv[2]
}

Awkに夢中になっていない場合は、Pythonに優れたCSVパーサーも付属しています。

import csv, sys

for row in csv.reader(sys.stdin):
    print row[2]

または、コマンドラインから(1行で少し注意が必要です):

python -c 'import csv,sys;[sys.stdout.write(row[2]+"\n") for row in csv.reader(sys.stdin)]' < input.txt
于 2012-09-06T20:03:29.120 に答える
0

区切り文字は単純なコンマであり、引用符の間のコンマではありません。フィールドにコンマが含まれていない場合は、awkがタスクに対応している可能性があります。

awk -F , '
  {
    if ($3 ~ /^".*"$/) {
        $3 = substr($3, 2, length($3)-2);
        gsub(/""/, "", $3);
     }
     print $3;
  }' input.txt

これはすでにかなり複雑になっています。フィールド内にカンマが含まれる可能性がある場合は、PerlやPythonなどで適切なCSVパーサーを使用してください。https://unix.stackexchange.com/questions/7425/is-there-a-robust-command-line-tool-for-processing-csv-filesを参照してください

于 2012-09-06T19:55:51.863 に答える
0

awknullフィールド区切り文字を設定することで行を解析できます。代わりに、変数printf("%s",$i)に割り当て$iて、次の場合に出力することができますinda==0

#echo "\"AAA,BBB\",\"CCC\",\"DDD, EEE, FFF\"" > uno

awk 'BEGIN { FS="" }
{
    for ( i=1; i<NF; i++) {
        if ( $i == "\"" )
            if ( inda == 0 ) 
                inda = 1
            else
                inda = 0
        if ( $i == "," )
            if ( inda == 0 )
                $i="|"
        printf("%s",$i)
    }
    printf("\n")
}' uno
于 2013-04-16T15:16:25.823 に答える