두 파일의 첫 번째 열을 기반으로 두 파일을 비교하고 일치하는 줄과 일치하지 않는 줄을 얻습니다.

두 파일의 첫 번째 열을 기반으로 두 파일을 비교하고 일치하는 줄과 일치하지 않는 줄을 얻습니다.

첫 번째 열을 기준으로 두 개의 탭으로 구분된 파일을 비교해야 하며 첫 번째 열이 두 번째 파일과 일치하면 첫 번째 파일의 전체 줄을 인쇄해야 합니다. 또한 첫 번째 파일에는 없지만 두 번째 파일에는 있는 항목을 추출해야 합니다.

파일 1.txt:

chr1_45795114_G_A   0.004251803
chr1_45796900_G_C   0.019459893
chr1_45796909_C_T   0.003777726
chr1_45797139_G_A   0.006444843
chr12_56487682_T_A  0.003622254

파일 2.txt:

chr12_56487682_T_A
chr19_9088697_T_C
chr11_108180929_T_-
chr1_45796909_C_T
chr19_9002597_C_T
chr1_45797139_G_A
chr1_45796900_G_C
chr2_48030697_T_G
chr7_151927025_A_G
chr1_45795114_G_A
chr1_211542902_G_-

원하는 출력:

chr1_45795114_G_A   0.004251803
chr1_45796900_G_C   0.019459893
chr1_45796909_C_T   0.003777726
chr1_45797139_G_A   0.006444843
chr12_56487682_T_A  0.003622254
chr19_9088697_T_C   0
chr11_108180929_T_- 0
chr19_9002597_C_T   0
chr2_48030697_T_G   0
chr7_151927025_A_G  0
chr1_211542902_G_-  0

원하는 결과를 얻기 위해 다음 코드를 사용하려고 합니다.

코드 1은 합계를 비교 file1하고 file2그 합계에서 일치하는 행을 추출합니다 file1.

awk -F "\t" 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' file1 file2 > matching_rows.txt

코드 2는 합계를 비교 file1하고 file2그 합계에서 일치하지 않는 행을 추출합니다 file2.

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

다음으로 연결 matching_rows.txt하여 nonmatching_rows.txt사용합니다.

cat matching_rows.txt nonmatching_rows.txt > combined.txt

이제 두 번째 열의 공백을 바꾸기 위해 다음 코드를 사용했습니다.

awk 'NF && $2==""{$2=0}1' FS="\t" OFS="\t" combined.txt > desired_output.txt

내 질문은 100개 이상의 파일을 file2.

답변1

그냥 먹이세요- 두 개의 파일이 포함된 스크립트입니다. 첫 번째 파일을 읽으면 ID 값을 저장하는 배열이 채워집니다.

두 번째 파일을 읽을 때 이전에 저장된 값과 함께 각 ID를 인쇄하십시오. 저장된 값이 없으면 하나가 인쇄됩니다 0.

FILENAME현재 읽고 있는 파일을 구별하려면 현재 처리 중인 파일 이름이 포함된 awk-Vaiable을 사용하십시오.

으악'
        파일 이름=="파일1.txt"{
                # 값 배열에 ID를 입력하면 됩니다.
                아이디 = $1
                값[ID] = $2
        }
        파일 이름=="file2.txt"{
                아이디 = $1
                # 설정되지 않은 배열 항목의 기본 내용은 빈 문자열입니다.
                if (val[id] == "") {
                        # val[]에는 값이 저장되어 있지 않습니다.
                        인쇄 ID "\t" 0
                } 다른 {
                        인쇄 ID "\t" val[id]
                }
        }
' 파일 1.txt 파일 2.txt

(위의 예는 최적화되었을 수 있지만 이해하기 쉽기를 바랍니다.)

답변2

file1의 첫 번째 열을 grep 명령의 검색 패턴으로 사용할 수 있습니다. 그러면 일치하는 두 번째 열이 없는 file2의 항목이 필터링됩니다.

$ cp file1.txt outfile
$ awk '{print $1}' file1 > patterns

(해당 패턴은 나중에 삭제할 수 있는 임시 파일입니다.)

그 다음에:

$ grep -v -f patterns <file2 >>outfile
$ cat outfile
chr1_45795114_G_A   0.004251803
chr1_45796900_G_C   0.019459893
chr1_45796909_C_T   0.003777726
chr1_45797139_G_A   0.006444843
chr12_56487682_T_A  0.003622254
chr19_9088697_T_C
chr11_108180929_T_-
chr19_9002597_C_T
chr2_48030697_T_G
chr7_151927025_A_G
chr1_211542902_G_-

빈 두 번째 열에 탭으로 구분된 0을 사용해야 하는 경우 다음과 같이 사용하세요.

$ awk 'NF==2{print $0} NF<2{print $1,"\t0"}' 출력 파일

답변3

for file in f1 f2 f3 f4
do
awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file2  $file >>output.txt
awk 'NR==FNR{a[$1];next}!($1 in a){print $0"\t""0" }' $file file2 >>output.txt
done

여기에서 각 반복의 출력은 output.txt 파일에 저장됩니다.

각 반복 출력을 별도의 파일에 저장해야 한다고 가정하면 다음 단계를 따라야 합니다.

for file in f1 f2 f3 f4
do
awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file2  $file >$file_file2
awk 'NR==FNR{a[$1];next}!($1 in a){print $0"\t""0" }' $file file2 >>$file_file2
done

관련 정보