次のファイルがあります
ファイル1
3 123456789
3 00000
2 123456789
2 abcde
1
4 abcdefgh
最初の列の行は、次のように他のファイルの行番号に関連付けられます。
ファイル2
$a&a(md
( l 0 p a$1
=2 3 x5 x4
&a”s?m!a
最初のファイルの最初の列の数字を2番目のファイルの対応する行の内容に置き換えてファイルを融合する方法が必要です。したがって、最終ファイルは次のようになります。
出力
=2 3 x5 x4 123456789
=2 3 x5 x4 00000
( l 0 p a$1 123456789
( l 0 p a$1 abcde
$a&a(md
&a”s?m!a abcdefgh
どの列がどの列であるかがわかる限り、形式は重要ではありません。
私はLinuxを使用しています。
どんな助けでも大変感謝します。
答え1
を使用して、行awk
(レコード)番号で索引付けされたfile2から配列を構成し、file1の最初のフィールドに基づいて検索できます。
$ awk 'NR==FNR {a[FNR]=$0;next} {printf "%s\t%s\n", a[$1], $2}' file2 file1
=2 3 x5 x4 123456789
=2 3 x5 x4 00000
( l 0 p a$1 123456789
( l 0 p a$1 abcde
$a&a(md
&a”s?m!a abcdefgh
このタブは2つの部分に分かれています。必要に応じてコンマで区切ることができます。
答え2
このjoin
コマンドを使用してこれを達成できます。共通フィールドに基づいて2つのファイルをマージします。以下は使用例ですbash
(読みやすくするために行を切りました)。
join -t , \
<(awk '{ print NR","$0; }' file2.txt | sort -k 1b,1 -t ,) \
<(awk '{ print $1","$2; }' file1.txt | sort -k 1b,1 -t ,) \
| cut -d , -f 2- \
| column -t -s ,
出力:
( l 0 p a$1 123456789
( l 0 p a$1 abcde
=2 3 x5 x4 00000
=2 3 x5 x4 123456789
&a”s?m!a abcdefgh
いくつかの説明:
- フィールドと列の処理方法を簡素化するための最初のステップは、区切り文字を標準化することです。ここでは
,
この意味が使われました。 awk
区切り記号を標準化するために使用されますfile1.txt
。file2.txt
行を結合する明示的なフィールドがないため、各行awk
に行番号を追加するために使用されます。- デフォルトでは、
join
ファイルは各ファイルの最初のフィールドを使用してリンクされます。したがって、どのフィールドを使用すべきかを指定する必要はありません。-t
与えられた表現フィールドはで区切ります,
。 join
両方の入力ファイルがソートされると予想されるため、期待されるデフォルトのソートが使用されていることをsort
確認するために使用されます。join
<( some_command )
匿名の名前付きパイプを作成します。デフォルトでは、コマンド出力をファイルとして使用できます。cut
出力から行番号フィールドを削除するために使用されます。- 最後に、
column
出力をテーブル(-t
)にフォーマットするために使用されます。から来るデータが複雑にならないようにするにはfile2.txt
、,
を区切り記号(-s ,
)として使用します。