如何在一个文件中找到与另一个文件相对应的值并打印后一个文件中的所有内容?

如何在一个文件中找到与另一个文件相对应的值并打印后一个文件中的所有内容?

我有以下类型的文件(file_1):

4.96798703303702 "YPL223C"
3.5545141639441 "YPL281C"
4.50082973953956 "YML042W"
5.43613972089831 "YMR107W"
4.81971559885503 "YBR072W"
4.31478270112112 "YDL204W"
3.66402710414498 "YBR117C"
5.79159144125629 "YMR175W"
3.02190667031174 "YMR250W"

我想在 file_2 上找到通讯员:

YPL223C
YBR117C
YPL223C
YBR117C
YMR175W
YMR175W

然后,我想将 file_1 第一列中的值复制到 file_2 上新创建的第二列,如下所示:

4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
5.79159144125629 "YMR175W"
5.79159144125629 "YMR175W"

我尝试过使用grep -F -f file_2 file_1,但这没有考虑重复,只考虑打印:

4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
5.79159144125629 "YMR175W"

有没有办法打印重复的内容?

答案1

怎么样

awk '
  NR==FNR {a[substr($2,2,length($2)-2)] = $0; next} 
  {print a[$1]}
' file_1 file_2
4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
5.79159144125629 "YMR175W"
5.79159144125629 "YMR175W"

答案2

使用 shell 脚本:

#!/bin/sh

file1=./file_1
file2=./file_2

while read -r n; do
    v=$(awk -v n="$n" '$2 ~ n {print $1}' "$file1")
    printf '%s "%s"\n' "$v" "$n"
done <"$file2"

笔记:这会将所有输出打印到标准输出。

这将读取每一行file_2并将其值设置为n。然后,它将读取file_1并查找第 2 列中存在 的值的行n,并打印第 1 列,并将其设置为变量v。然后它将以您想要的格式打印n,并且可以根据您的意愿重定向。v


创建文件:

#!/bin/sh

file1=./file_1
file2=./file_2

while read -r n; do
    v=$(awk -v n="$n" '$2 ~ n {print $1}' "$file1")
    printf '%s "%s"\n' "$v" "$n"
done <"$file2" > file_3

但是,由于您想将这些值添加到file_2您可以简单地覆盖file_2file_3但我建议在此之前运行上述内容以确保它产生正确的结果。在进行任何更改之前备份两者也没有什么坏处file_1file_2

#!/bin/sh

file1=./file_1
file2=./file_2

while read -r n; do
    v=$(awk -v n="$n" '$2 ~ n {print $1}' "$file1")
    printf '%s "%s"\n' "$v" "$n"
done <"$file2" > file_3

mv file_3 "$file2"

答案3

尝试使用下面的脚本并且工作得很好

for i in `cat file2`; do j=`sed -n '/'$i'/p' file1|awk '{print $1}'`; k=`awk -v i="$i" '$1 == i {print $0}' file2|sort | uniq| awk '{print NF}'`; if [[ $k == 1 ]]; then sed -i "/$i/s/.*/& $j/g" file2; fi; done

输出

YPL223C 4.96798703303702
YBR117C 3.66402710414498
YPL223C 4.96798703303702
YBR117C 3.66402710414498
YMR175W 5.79159144125629
YMR175W 5.79159144125629

相关内容