![한 파일에서 다른 파일에 해당하는 값을 찾고 후자 파일의 모든 내용을 인쇄하는 방법은 무엇입니까?](https://linux55.com/image/159070/%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94%20%EA%B0%92%EC%9D%84%20%EC%B0%BE%EA%B3%A0%20%ED%9B%84%EC%9E%90%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EB%82%B4%EC%9A%A9%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음과 같은 유형의 파일(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
쉘 스크립트를 사용하십시오:
#!/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