3

区切り文字に基づいて文字列をファイルに分割しようとしていますが、正しく実行できません...以下のコードを次に示します。

awk 'var=split($2,arr,'\'); {print $var}' file1.dat

これが私のサンプルデータです。

Col1 Col2
abc  123\abc
abcd 123\abcd

希望の出力:

Col1 Col2
abc  abc
abcd abcd
4

5 に答える 5

6

splitを呼び出す必要はありません。\\フィールドセパレータとして使用するだけです。

echo 'a\b\c\d' | awk -F\\ '{printf("%s,%s,%s,%s\n", $1, $2, $3, $4)}'

出力:

a,b,c,d
于 2012-04-12T20:23:15.980 に答える
1

サンプルデータと出力は、あなたの要件を推測するのに最適です。

 echo '1:2\\a\\b:3' | awk -F: '{ 
     n=split($2,arr,"\\")
     # print "#dbg:n=" n
     var=arr[3]
     print var
     }'

出力

b

split分割することがわかったフィールドの数を返すことを思い出してください。デバッグ行のコメントを解除すると、値3が返されます。

また、私のテストでは、1を処理するために2つの'\'文字を使用する必要があったことにも注意してください。ファイルにそれが必要になるとは思いませんが、これがファイルで機能しない場合は、必要に応じてデータに「\」を追加してみてください。'\'の使用方法についていくつかのバリエーションを試しましたが、これが最も簡単なようです。他の人はコメントを歓迎します!

これがお役に立てば幸いです。

于 2012-04-12T20:15:47.437 に答える
0

いくつかのコメントで述べたように、あなたは一重引用符をネストしています。二重引用符を使用するように1つのセットを切り替えると、修正されるはずです。

awk 'var=split($2,arr,"\"); {print $var}' file1.dat

splitを使用するよりも、別のawkコマンドにパイプする方がいいと思います。一方が他方より優れているかどうかはわかりませんが、これは単なる好みです。

awk '{print $2}' file1.dat | awk -F'\' '{...}'
于 2012-04-12T20:51:40.510 に答える
0

分割しようとしているバックスラッシュをエスケープする必要があります。split次のような二重引用符を使用して、これを行うことができます。"\\"

また、配列スライスを取得して、コードを読みやすくすることもできます(また、別の変数を定義しないようにすることもできます)。これはあなたのために働くはずです:

awk 'NR==1 { print } NR>=2 { split($0,array,"\\"); print $1,array[2] }' file1.dat

HTH

于 2012-04-13T00:25:03.907 に答える
0
awk '{sub(/123\\/,"")}1' file

Col1 Col2
abc  abc
abcd abcd
于 2017-06-13T00:14:44.323 に答える