新しい列を作成

新しい列を作成


このファイルには2つの入力ファイルがあります1

 a  1 
 b  2 
 c  3 
 d  4 

ファイル2

 a
 a
 b
 c
 c
 c
 d 
 d

次の出力を得るためにシェルスクリプトをどのように作成できますか?

 a  1 
 a  1 
 b  2 
 c  3 
 c  3 
 c  3 
 d  4 
 d  4

貼り付け方法を試してみましたが、アルファベットと合わない順序で該当数字だけを貼り付けます。どんな指針でも感謝します。

答え1

両方のファイルが最初の列に基づいてソートされているとします。

$ join file1 file2
a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4

ユーティリティがjoin実行されます。リレーショナル INNER JOIN 演算2つの入力ファイルについて。デフォルトでは、最初の列は結合列です。必要この列を並べ替えます。

答え2

awkを使用して最初のファイルを配列として読み込み、2番目のファイルに基づいて印刷します。ここでは入力をソートする必要はありません。

$ awk 'FNR==NR { a[$1] = $2; next } { print $1, a[$1] }' file1 file2
a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4

答え3

これを達成するためにシェルスクリプトが実際に必要だとは思わないが、必要な場合(例えば、結合、grepなどがない場合)、組み込みスクリプトだけが必要です。

#you should not have spaces in start of file1.txt or file2.txt
search_first_col(){ 
         while read -r col nextcol ; do 
            case $col in "$1") 
                    echo "$col $nextcol" ;; 
            esac 
         done 
       }
while IFS= read -r lin ; do 
       search_first_col "$lin" </tmp/file1.txt
done </tmp/file2.txt

答え4

ミラー(https://github.com/johnkerl/miller/releases)

mlr --nidx --fs " " join -j 1 -f file2 file2

あなたは

a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4

関連情報