列数が異なり、行数が多い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 > 1
2番目のファイルでヘッダーなしの行を選択する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,,,