ファイルから列を読み取り、別のファイルの特定の列を追加します。

ファイルから列を読み取り、別のファイルの特定の列を追加します。

次の 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

重要なのは、最初のファイルから取得した数字で区切られたprintffileBの最初と3番目のフィールドを印刷することです。,nf=NF-1

答え2

tail -n+2 fileB | sed -r 's/[[:space:]]+/,,,,,,/' | cat fileA - > Output

説明する

tail -n +2 fileBfileB の最後の書き込みは、最初の行を無視したいので、2 番目の行から始まります。

sed、使用(-r, --regexp-extendedメタ文字の意味を示すために+最後のもの') は、最初の空白文字セットを、例で予想されるカンマの数に置き換えます。

cat最後に、fileAとパイプsed(呼び出し)を介して受信したデータを関連付けて-作成すると、要求に応じてデータがファイルにリダイレクトされますstdoutOutput

限定

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_

関連情報