awk matchで変数を渡すにはどうすればよいですか?

awk matchで変数を渡すにはどうすればよいですか?

awkコマンドがあります。変数を使用する必要がiありますが、これを行うとコマンドは機能しません。

"fechaName": "1", "firstName": "gdrgo", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx "":"ジョン","姓":"222",dfg
"fechaName": "2", "xxxxx": "John", "Name": "Beto", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "最後名前" ": "111", "xxxxx": "ジョン",
"fechaName": "4", "xxxxx": "John", "Name": "Beto", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "最後名前" ": "111", "xxxxx": "ジョン",
"fechaName": "4", "xxxxx": "John", "xxxxx": "John", "FirstName": "beto2", "xxxxx": "John", "Lastname": "555", "xxxxx " ": "ゾーン", "xxxxx": "ゾーン",
"fechaName": "5", "xxxxx": "John", "xxxxx": "John", "FirstName": "beto2", "xxxxx": "John", "Lastname": "444", "xxxxx " ": "ゾーン", "xxxxx": "ゾーン",
"fechaName": "4", "firstName": "gdrgo", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx "":"ジョン","姓":"222",dfg
"fechaName": "7", "xxxxx": "John", "xxxxx": "John", "名前": "beto2", "xxxxx": "John", "姓": "444", "xxxxx " ": "ゾーン", "xxxxx": "ゾーン",

代わりに5を使用すると「私」効果がある

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /5"/) )  print $0 }'   sumacomando

これは私の命令です。

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /**i**"/) )  print $0 }'   sumacomando

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /i"/) )  print $0 }'   sumacomando

ベストアンサー1

一度にすべてのレコードを並べ替えることはできません。

文字通り主な質問に答えてフィールドを変数と一致させるためにこれを行う必要はありませんmatch($2,i)/.../または後にmatch($2, i "\"").が続き、通常の文字列連結構文を使用します)。i"

これにより、「4」を含むレコードに対して正しい結果が得られます。

awk '{i=4}$0 ~ "\"" i "\""' file1 #(string concatenation yelds to "4")

ただし、この方法はうまく機能しますが、期待どおりにデータを自動的に並べ替えることはありません。

awk '{for (i=1;i<8;i++) if ($0 ~ "\"" i "\"") print}' file1

すべての履歴を並べ替えるには、まずすべての履歴をメモリにロードしてから、並べ替えられた順序で印刷する必要があります。

サンプルファイルに適用される他のアプローチは次のとおりです。

awk  -F"[\"]" '{a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0;last=NR}END{for (i=1;i<=last;i++) if (a[i]) print a[i]}' file1

ここでオンラインテストを確認してください。

" 最初の行の区切り文字テキストを使用すると、4つの部分に分割され "fechaName": "1",....1フィールド$ 4)、整数として直接使用できます。

この部分はa[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0if-then-elseにすぎません。

a[$4](==>最初の行の場合)すでに値がある場合は、a[1]出力レコード区切り文字(ORS)を使用してa [$ 4]の前の内容にこの行を追加します。これは新しい行(または短い「\ n」) - それ以外の場合は$ 0をa [$ 4]に適用します。

最後に、最後の部分はこの配列aを印刷します。

ここでは、この操作では、ソートがawkよりはるかに高速であると言う必要があります。

LC_ALL=C sort -t"\"" -k3 file1

おすすめ記事