編集する

編集する

列数が異なり、行数が多い2つのファイルがあります。

bash-3.00$ cat fileA 
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,

PS1:a1 - a9はコンマ(、)で区切られたヘッダーです。 PS2:ピリオド(.)は、2行の間に複数の行があることを示します。

bash-3.00$ cat fileB 
b1      b2
f       t
a       p
m       n
..........      
m       y
t       o

PS:b1 - b2はヘッダであり、スペースで区切られています。

fileAの列a2とa6を列b1とb2の内容に追加したいと思います。つまり、列a2は列b1に追加され、列a6は列b2に追加されます。

したがって、出力ファイルは次のようになります。

bash-3.00$ cat output 
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................       
z,p,,,,w,e,,
,f,,,,t,,,
,a,,,,p,,,
,m,,,,n,,,
.........................
,m,,,,y,,,
,t,,,,o,,,

単純なawkコマンドでこれをどのように実行できますか?

答え1

必要なのは、i) file1 の内容を file2 に追加し、ii) file2 の形式をファイル 1 の形式と一致するように変更することです。これはあなたの質問が実際に求めるものではなく、結果に表示されるものです。私が誤解した場合は、質問を修正して明確に説明してください。

これを行うには、次のようにします。

awk 'NR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file2 >> file1 

file1これにより出力ファイルが生成されます。これを維持するには、file1次の手順を実行します。

( cat file1; awk 'NR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file2 ) > out

あるいは、すべてのことを行うこともできますawk(これはArchemarソリューションの単純化されたバージョンにすぎません)。

awk 'NR==FNR{print; next} FNR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file1 file2 > out

答え2

努力する

awk 'FNR == NR { print ; next ; } 
     NR > FNR && FNR > 1 { 
          split($0,A) ; 
          printf ",%s,,,,%s,,,\n",A[1],A[2] ;  }' f1 f2 

(一行で書くこともできますが、読みやすいように分けました。)

どこ

  • FNR == NR { print ; next ; } 最初のファイルから行をコピーする
  • NR > FNR && FNR > 12番目のファイルでヘッダーなしの行を選択する
  • split($0,A) ; 2つの変数を配列に入れます(A)。
  • printf ",%s,,,,%s,,,\n",A[1],A[2] ;印刷して

編集する

f1でテスト

a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,

そしてf2

b1  b2
f   t
a   p
m   n
m   y
t   o

ランニング:

awk 'FNR == NR { print ; next ; } NR > FNR && FNR> 1 { split($0,A) ; printf ",%s,,,,%s,,,\n",A[1],A[2] ;  }' f1 f2

結果:

a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,
,f,,,,t,,,
,a,,,,p,,,
,m,,,,n,,,
,m,,,,y,,,
,t,,,,o,,,

関連情報