file1の数字をfile2の対応する行に置き換えます。

file1の数字をfile2の対応する行に置き換えます。

次のファイルがあります

ファイル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 ,)として使用します。

関連情報