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