2017-12-21 55 views
0

免責を2出力ファイルを生成します。私は、この問題は簡単trなどを使用して解決することができます知っているが、私はそれだけawkに動作させるために好奇心旺盛です。AWK:別のOFSと

awkを使用して異なるOFSで2つの出力ファイル(同じ内容)を生成したいとします。ここまで私が間違っていることを知っているこれまでに試したことは、

awk '$14==1 { 

{print $0 > "output.txt"} 
{OFS=","} 
{print $0 > "output.csv"} 

}' inputfile.txt 

(入力ファイルはタブで区切られています)です。私がこれを実行すると、正確に同じ内容で、元のOFSを持つ2つのファイル(適切にフィルタリングされた$14==1)が得られます。私は

{print $1","$2...} 

または

{printf("%s,%s,,,\n",$1,$2...)} 

を行うことによって「」私は明示的に使用するためにprint文を言うことができる知っているが、入力ファイルには、50以上の列があり、私はこのエレガントな解決策があると感じます。

ありがとうございます!

+0

私は何を意味することは、両方の出力ファイルは、ので、私の 'OFS =「」'ラインまったく同じ(何も返しませんoutput.csv' '差分output.txtと)であるということです何も変わらなかった。 –

答えて

1

$xの値を変更せずにちょうどprintにすると、OFSは適用されません。

することはでき:$1=$1は、$1の値であっても同じ値を持つ場合は、この意志を変更上記のコードで

awk -F',' '{print $0 > "file1";$1=$1;print $0 > "file2"}' input 

、:

awk -F',' '{print $0 > "file1"}{gsub(FS, " ");print $0 > "file2"}' input 

またはデフォルトOFSを利用しますOFSを適用してください。

+0

それは働いて、多くの感謝! –

1

入力ファイルまたはあなたの中に使用FSは、出力レコードを再構築するために他の理由がないもされていない場合でも、2つの異なる出力ファイルで、2つの異なるOFS値を使用するには:のようなタブ区切りの入力を考えると

awk '$14==1 { 
    $1=$1; print > "output.txt"  # use the original OFS value 
    ofs=OFS; OFS="," 
    $1=$1; print > "output.csv"  # use the alternate OFS value 
    OFS=ofs 
}' inputfile.txt 

空白で区切られた出力.txtファイルとカンマで区切られた出力.csvファイルが作成されます。 .txtファイルをタブ区切りにするには、OFSをタブとして設定する必要があります(また、空白の文字や空のフィールドを入力に含めることができる場合は、FSをタブに設定することもできます)。

また、このことを考慮してください。

awk -v ofs1='|' -v ofs2=',' '$14==1 { 
    OFS=ofs1; $1=$1; print > "output.txt"  # use ofs1 
    OFS=ofs2; $1=$1; print > "output.csv"  # use ofs2 
}' inputfile.txt 
+1

そのような徹底的な説明に感謝します! –