2017-07-20 4 views
0

この質問はAWK:異なる出力インラインセパレータと異なる出力EOFセパレータを使用して、1秒ごとにフィールドを印刷しますか?

11,1111 
22,2222 
33,3333 
44,4444 
55,5555 
66,6666 

コマンドピースバイピースの行動を説明できusing awk to print every second fieldに関連しているが、私は私が取得したいしながら、問題はきちんと

$ cat printEachSecondColumnValue 
1,11,111,1111,11111 
2,22,222,2222,22222 
3,33,333,3333,33333 
4,44,444,4444,44444 
5,55,555,5555,55555 
6,66,666,6666,66666 
$ gawk -v RS=, -v ORS="\n" '0==NR%2' printEachSecondColumnValue 
11 
1111 
22 
2222 
33 
3333 
44 
4444 
55 
5555 
66 
6666 
$ gawk -v RS=, -v ORS="," '0==NR%2' printEachSecondColumnValue 
11,1111,22,2222,33,3333,44,4444,55,5555,66,6666, 

それを印刷したのですインラインセパレータとEOFを別々に定義して2つの列を取得する方法はありますか?

+0

「RS」は、行終端記号が**レコード分離記号ではないことを意味します。 '1111 2 'は1レコードです。 – Kaz

答えて

2

私は

11,1111 
22,2222 
33,3333 
44,4444 
55,5555 
66,6666 

恩赦に明白なの、この侵入を取得したいが、それは、与えられたデータのために

awk 'BEGIN { FS = OFS = ","} { print $2, $4 }' 

だけ

ですが。偶数フィールドを印刷するには

かかわらずありますどのように多くの、我々はループでprintを置き換えることができます。何かAについて、今

 for (i = 2; i <= NF; i += 2) { 
     if (i > 2) 
      printf OFS 
     printf "%s", i 
     } 

:カンマため

awk 'BEGIN { 
     FS = OFS = "," 
    }              
    {                   
     for (i = 2; i <= NF; i += 2) {           
     printf "%s", i               
     if (i + 2 <= NF)              
      printf OFS               
     }                   
     printf "\n"                
    }' 

代替ロジック少し違う。 のフィールドを編集したい場合はどうすればいいですか?それではprintで印刷するだけです。

awk 'BEGIN { FS = OFS = ","} 
    { 
     for (i = 2; i <= NF; i += 2) { 
     j = i/2 
     $j = $i 
     }  
     NF = j 
     print 
    }' 

我々はNFに割り当てた場合、それが今では多くのフィールドがあることを意味します。 いずれかのフィールドを変更するか、またはNFを変更すると、デフォルトでprintが出力する$0の値はフィールド値をOFSに組み合わせて再計算されます。 TXR言語でLispのマクロとして実装

スマートAwkの、:ここ

$ txr -e '(awk (:set fs "," ofs fs) 
       (t (set f (select f (range 1 : 2))) 
        (prn)))' 
1,2,3,4,5,6,7,8,9,10 
2,4,6,8,10 
1,2,3,4 
2,4 

(:set ...)句は初期変数を設定するためのものです。 fsFSのアナログであり、カンマに設定されています。 はfsに設定されています。

tは、ブール値trueを意味します。この句は、すべてのレコードに対して発生します。次に、ゼロベースのリスト(1 3 5 7 9 ...)によって示される2番目、3番目、4番目のフィールドを選択してフィールドfのリストを編集します。 (range 1 : 2)を使用してこのインデックスリストの無限の、怠惰なバージョンを生成し、それをselect関数に供給します。

fに割り当てると、でレコード変数rec$0に類似)を再構成します。引数なしのprn関数はrecを出力します。

私たちは、そのfの修正とapplyprnへの引数として直接selectの出力を供給することによってrec設定の副作用を取り除くことができます。

txr -e '(awk (:set fs "," ofs fs) 
      (t [apply prn (select f (range 1 : 2))])))' 

「で、偶数フィールドへprnを適用しますカンマです。

関連する問題