2017-05-08 2 views
1

であるtest.txtファイル内の入力テキストを複数のパターンを使用するには:どの条件

{"col1":"250000","col2":"8089389","col4":"09876545","col3":"121","col5":"123456789"} 
{"col1":"210000","col3":"112","col2":"8089389","col4":"09876545","col5":"123456789"} 
{"col1":"120000","col2":"8089389","col3":"123","col4":"09876545","col5":"123456789"} 
{"col1":"170000","col2":"8089389","col4":"09876545","col5":"123456789","col3":"123"} 
{"col1":"190000","col2":"8089389","col4":"09876545","col5":"123456789,"col3":"124""} 
{"col3":"176","col1":"220000","col2":"8089389","col4":"09876545","col5":"123456789"} 

コマンドラインと、私が試したことを結果:

$ awk -F"," '{for(i=1;i<=NF;i++){ if($i ~ /col1/){print $i} };for (x=1;x<=NF;x++){if($x ~ /col3/){print $x}}}' test.txt 
{"col1":"250000" 
"col3":"121" 
{"col1":"210000" 
"col3":"112" 
{"col1":"120000" 
"col3":"123" 
{"col1":"170000" 
"col3":"123" 
{"col1":"190000" 
"col3":"124" 
{"col1":"220000" 
"col3":"176" 

私は希望の期待される結果取得する:

col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:124 
col1:220000,col3:176 

答えて

2

あなたはjsonファイルを解析しているようです。あなたはより多くの情報については、

$ jq --raw-output '"col1:" + .col1 + ",col3:" + .col3' file.json 
col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:124 
col1:220000,col3:176 

jq使用することができます:jq manual

+0

私のサーバーには残念ながらjqはありません。インストールする権限がありません。 awkのアイデア? –

+0

@RafaelNguyen、それをインストールする必要はありません。あなたはプリコンパイルされたバイナリ[ここ](https://stedolan.github.io/jq/)を入手できます。 – sat

1

試してみてください。私は世界的に文字を{} "を代入しています

awk '{gsub(/\{|\"|\}|\;/,"");match($0,/col1[^,]*/);VAL1=substr($0,RSTART,RLENGTH)",";match($0,/col3[^,]*/);VAL2=substr($0,RSTART,RLENGTH);if(VAL1 && VAL2){print VAL1 VAL2}}' Input_file 

;ラインで、その後の一致を探して各行にcol1とcol3文字列があり、col1とcol3の両方の文字列が存在する場合は、それを印刷します。

E DIT:溶液の1本以外のライナーフォームを追加することもできます。

awk '{ 
     gsub(/\{|\"|\}|\;/,""); 
     match($0,/col1[^,]*/); 
     VAL1=substr($0,RSTART,RLENGTH)","; 
     match($0,/col3[^,]*/); 
     VAL2=substr($0,RSTART,RLENGTH); 
     if(VAL1 && VAL2){ 
           print VAL1 VAL2 
         } 
     } 
    ' Input_file 
1

jsonツールが不足して、ここにあなたが持っているデータを操作しているときはいつでもawk

$ awk -F'[:,]' -v OFS=, -v cols='col1,col3' ' 
     {n=split(cols,c); 
     gsub(/[{}"]/,""); 
     for(i=1;i<NF;i+=2) a[$i]=$(i+1); 
     for(i=1;i<=n;i++) printf "%s%s", (c[i]":"a[c[i]]), (i==n?ORS:OFS)}' file 

col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:124 
col1:220000,col3:176 
0

をハックある場合名 - >値のマッピング、それは最初にそのマッピングを格納する連想配列を作成するのが最善です(n2v[]以下)、名前で配列内を検索するだけで、任意の値を印刷できます。

$ cat tst.awk 
BEGIN { RS="}"; FS="\""; OFS="," } 
{ 
    for (i=2; i<=NF; i+=4) { 
     n2v[$i] = $(i+2) 
    } 
    print p("col1"), p("col3") 
} 
function p(n) { return (n ":" n2v[n]) } 

$ awk -f tst.awk file 
col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:123 
col1:220000,col3:176 
col1:220000,col3:176