我有以下类型的文件(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_2
,file_3
但我建议在此之前运行上述内容以确保它产生正确的结果。在进行任何更改之前备份两者也没有什么坏处file_1
。file_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