2016-06-17 18 views
0

Linuxサーバーにフィールドの分散がある複数の行を持つcsvファイルがあります。私はすべてのレコードが最大数の列を持つ行(空の値)を持つようにしたいと思います。私はこれをbashスクリプトで実現する必要があります。可能であればawkを使ってみたいと思っています。私はbashを初めて使っています。.csvファイルにbashの各行の列数が同じであることを確認してください。

+0

カラムはどのように分かれていますか? 'awk '{NF = 5} 1' file.txt'はスペース上の各行を分割し、最初の5列を出力します。そして、 '-F '、' 'を使うことで区切り文字としてカンマを設定することができます。 – andlrc

+0

はい、カンマで区切られています。 –

答えて

3

awkレスキュー あなたは説明

$ awk -F, -v OFS=, 'NR==FNR{if(max<NF)max=NF;next}; 
          {NF=max}1' file{,} 
1,2,3,4,5, 
1,2,3,4,, 
1,2,3,,, 
1,2,3,4,5,6 

T.J.のサンプル入力ファイルを使用して、ひとつのスクリプトですべての操作を行うことができます。最初のラウンドは最大を計算し、第二に使用するにこれは、ダブルパスアルゴリズムです。 NR==FNRは最初のファイルでのみtrueで、maxを計算します。デフォルト値はゼロで長さは負ではないため、maxを初期化する必要はないことに注意してください。 nextはスクリプトの残りの部分をスキップします。第2ラウンドの設定では、NF=maxは少ないフィールドでレコードをいっぱいにします。 1は、awkのデフォルトに基づく印刷(または真のステートメント)の略語として使用されます。また、file{,}は、ダブルパスアルゴリズムで同じファイルを2回使用するとfile fileに解決されます。

同じことは、シングルパスの配列とENDブロックでも記述できます。

+0

T.J.のサンプルはどこですか? –

+0

ブラボー - ベストアンサー!説明を追加していただきありがとうございます。 –

+0

美しく働いた!ありがとうございました!素晴らしい説明も。私はbashを初めて使っているので、誰かが何が起こっているのか、特にawkについて説明するのは素晴らしいことです! –

関連する問題