我有两个输入文件,例如此
文件 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