次の 2 つのファイルがあります。
ファイルA:
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ファイルB:
NE_Name SW
ABC 4.4
ASD 4.3
... ...
fileAは1行だけで構成され、複数のヘッダー(名前、サイト名など)があります。そして、fileBには膨大な数の行を含む2つのフィールドがあります。
これら2つのファイルを結合したいと思います。
結果ファイル:
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,4.4
ASD,,,,,,4.3
したがって、出力ファイルにはfileA内のすべてのヘッダーがあり、「Name」(fileBから取得した「NE_Name」値を使用)と「SW」(fileBから取得した「SW」値を使用)という拡張フィールドがあります。
上記の2つの入力ファイルからこの出力ファイルをどのように取得できますか?
答え1
1つの方法は次のとおりですawk
。
$ awk -F, 'NR==1{nf=NF-1; print $0; FS=" "} \
NR>2{printf("%s%.*s%s\n",$1,nf,",,,,,,,,,,,,,,,,,",$2)}' fileA fileB
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,4.4
ASD,,,,,,4.3
重要なのは、最初のファイルから取得した数字で区切られたprintf
fileBの最初と3番目のフィールドを印刷することです。,
nf=NF-1
答え2
tail -n+2 fileB | sed -r 's/[[:space:]]+/,,,,,,/' | cat fileA - > Output
説明する
tail -n +2 fileB
fileB の最後の書き込みは、最初の行を無視したいので、2 番目の行から始まります。
sed
、使用(-r, --regexp-extended
メタ文字の意味を示すために+
最後のもの') は、最初の空白文字セットを、例で予想されるカンマの数に置き換えます。
cat
最後に、fileAとパイプsed
(呼び出し)を介して受信したデータを関連付けて-
作成すると、要求に応じてデータがファイルにリダイレクトされますstdout
。Output
限定
NE_Name 列または SW 列に空白文字が含まれている場合は効果がありません。
答え3
別のsed
方法:
$ sed 's/ */,,,,,,,/;/NE_/d' fileA fileB
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,,4.4
ASD,,,,,,,4.3
最初のsed
コマンドは3つ以上のスペースを7つのカンマで置き換え、2番目のコマンドは一致する行をすべて削除しますNE_
。