创建新列

创建新列

我有两个输入文件,例如此
文件 1

 a  1 
 b  2 
 c  3 
 d  4 

文件2

 a
 a
 b
 c
 c
 c
 d 
 d

我如何创建一个 shell 脚本以获得以下输出

 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

使用 awk,将第一个文件读入数组并根据第二个文件进行打印。输入不需要在这里排序:

$ 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

我不认为你真的需要 shell 脚本来实现这一点,但如果你想要(例如,如果你没有 join、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

相关内容