awk, sed 또는 grep을 사용하여 여러 파일의 내용 추가

awk, sed 또는 grep을 사용하여 여러 파일의 내용 추가

파일 1과 파일 2의 이름을 다음 형식으로 지정해야 합니다.

파일 1에는 18000줄이 있습니다.

COL1 COL2 COL3 COL4 COL5

-   .   ID  =   tom_fa_10005086
-   0   Parent  =   tom_fa_10005086
-   0   Parent  =   tom_fa_10005086
-   2   Parent  =   tom_fa_10005086
-   1   Parent  =   tom_fa_10005086
-   0   Parent  =   tom_fa_10005086
-   0   Parent  =   tom_fa_10005086
+   .   ID  =   tom_fa_10013928
+   0   Parent  =   tom_fa_10013928
+   0   Parent  =   tom_fa_10013928
+   0   Parent  =   tom_fa_10013928
+   0   Parent  =   tom_fa_10013928
+   2   Parent  =   tom_fa_10013928
+   2   Parent  =   tom_fa_10013928
+   1   Parent  =   tom_fa_10013928
+   1   Parent  =   tom_fa_10013928
+   2   Parent  =   tom_fa_10013928
+   2   Parent  =   tom_fa_10013928
-   .   ID  =   tom_fa_10000024
-   0   Parent  =   tom_fa_10000024
-   .   ID  =   tom_fa_10004587
-   0   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
+   .   ID  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+   .   ID  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   2   Parent  =   tom_fa_10007441

그리고 파일 2

COL 1            COL 2

tom_fa_10005086 ABI3VP1
tom_fa_10013928 ABI3VP2
tom_fa_10000024 Alfin-like
tom_fa_10011338 C2C2-Dof
tom_fa_10003474 C2C2-Gata
tom_fa_10003291 C2H2
tom_fa_10007064 C2H2
tom_fa_10008972 C2H2
tom_fa_10009025 C2H2
tom_fa_10005726 C3H
tom_fa_10011317 C3H
tom_fa_10010708 CPP
tom_fa_10002138 E2F-DP
tom_fa_10009443 G2-like
tom_fa_10008970 GRAS

내가 하고 싶은 일은 (파일 1)의 열 5와 열 1(파일 2)이 동일한 경우 열 2(파일 2)에 해당하는 파일 1의 열 6에 추가하는 것입니다.

그래서 그것은 다음과 같습니다

-   .   ID  =   tom_fa_10005086   ABI3VP1
-   0   Parent  =   tom_fa_10005086   ABI3VP1
-   0   Parent  =   tom_fa_10005086   ABI3VP1
-   2   Parent  =   tom_fa_10005086   ABI3VP1
-   1   Parent  =   tom_fa_10005086   ABI3VP1
-   0   Parent  =   tom_fa_10005086   ABI3VP1
-   0   Parent  =   tom_fa_10005086   ABI3VP1
+   .   ID  =   tom_fa_10013928   ABI3VP2
+   0   Parent  =   tom_fa_10013928   ABI3VP2
+   0   Parent  =   tom_fa_10013928   ABI3VP2
+   0   Parent  =   tom_fa_10013928   ABI3VP2
+   0   Parent  =   tom_fa_10013928   ABI3VP2
+   2   Parent  =   tom_fa_10013928   ABI3VP2
+   2   Parent  =   tom_fa_10013928   ABI3VP2
+   1   Parent  =   tom_fa_10013928   ABI3VP2
+   1   Parent  =   tom_fa_10013928   ABI3VP2
+   2   Parent  =   tom_fa_10013928   ABI3VP2
+   2   Parent  =   tom_fa_10013928   ABI3VP2
-   .   ID  =   tom_fa_10000024   Alfin-like
-   0   Parent  =   tom_fa_10000024   Alfin-like
-   .   ID  =   tom_fa_10004587
-   0   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
+   .   ID  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+   .   ID  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   2   Parent  =   tom_fa_10007441

fgrep -f file 2 file1을 사용해 보았지만 열 2 file2의 정보를 병합하는 방법을 모르고 문자열이 동일하지 않습니다.

답변1

한 번에 수행하려면 다음 sed스크립트가 작동합니다.

sed '/^[^ ]* [^ ]*$/{H;d;};G;s/ \([^ ]*\)\n.*\n\1 \([[:print:]]*\).*/ \1   \2/;P;d' file2 file1

그것은 무엇을 합니까? file2예약된 공간의 모든 행을 일종의 조회 테이블로 수집한 다음 해당 테이블을 패턴 공간의 각 행에 추가하고 패턴이 발견되면 6번째 열을 추가합니다. 상세히:

  • /^[^ ]* [^ ]*$/{}두 개의 열이 있는 행을 일치시키려면 해당 열에 대해서만 다음 명령을 실행합니다(내부 명령
  • {H;d;}이 줄을 예약된 공간에 추가하고 해당 줄의 추가 처리를 중지하므로 나머지 스크립트는 다음 줄에 대해서만 실행됩니다.file1
  • G패턴 공간에 조회 테이블이 있는 예약된 공간을 추가합니다.
  • s/ \([^ ]*\)\n.*\n\1 \([[:print:]]*\).*/ \1 \2/일치 항목에 여섯 번째 열을 추가할지 여부
  • P첨부된 테이블 없이 행 인쇄
  • d다른 출력 억제(옵션도 -n동일한 작업을 수행함)

답변2

다음 명령을 사용해보십시오. 잘 작동합니다.

Step1

awk 'NR==FNR{a[$5];next}($1 in a){print $0}' file1 file2 > u.txt
count=`awk '{print NR}' u.txt | sort -nr| sed -n '1p'`

step2

for ((i=1;i<=$count;i++)); do h=`awk -v i="$i" 'NR==i{print $1}' u.txt`; j=`awk -v i="$i" 'NR==i{print $2}' u.txt `; awk -v h="$h" -v j="$j" '$5 == h {$6=j;print $0}' file1; done >file3.txt


step3

awk 'NR==FNR{a[$1];next}!($5 in a){print $0}' file2 file1 >file4.txt


Step4(Final output)

awk '{print $0}' file3.txt file4.txt
- . ID = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
- 2 Parent = tom_fa_10005086 ABI3VP1
- 1 Parent = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
+ . ID = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
+ 1 Parent = tom_fa_10013928 ABI3VP2
+ 1 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
- . ID = tom_fa_10000024 Alfin-like
- 0 Parent = tom_fa_10000024 Alfin-like
-   .   ID  =   tom_fa_10004587
-   0   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
+   .   ID  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+   .   ID  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   2   Parent  =   tom_fa_10007441

관련 정보