두 파일의 첫 번째 열을 기준으로 두 개의 탭으로 구분된 파일을 비교하고 출력 파일에 일치하는 항목과 일치하지 않는 항목을 인쇄합니다.

두 파일의 첫 번째 열을 기준으로 두 개의 탭으로 구분된 파일을 비교하고 출력 파일에 일치하는 항목과 일치하지 않는 항목을 인쇄합니다.

두 개의 탭으로 구분된 파일(fileA.txt 및 fileB.txt)이 있고 fileA.txt의 첫 번째 열을 fileB.txt의 첫 번째 열과 비교해야 하며 두 번째 열에 있는 내용을 인쇄하려고 합니다. 출력 파일 fileB.txt. 아래는 내꺼야

fileA.txt

id
chr1_45796849_A_T
chr1_45796854_C_T
chr1_45797174_T_A
chr1_45796852_G_C
chr19_9018540_A_G
chr19_9002576_T_C
chr1_45797487_A_G
chr1_45797153_A_T
chr1_45797750_C_T

FileB.txt

chr_pos             freq.var
chr1_45796849_A_T   0.028399811
chr1_45796852_G_C   0.019154034
chr1_45796854_C_T   0.015872901
chr1_45797153_A_T   0.010129176
chr1_45797487_A_G   0.012981216
chr1_45797750_C_T   0.024949931

다음은 예상되는 결과입니다

id                  freq.var
chr1_45796849_A_T   0.028399811
chr1_45796854_C_T   0.015872901
chr1_45797174_T_A   
chr1_45796852_G_C   0.019154034
chr19_9018540_A_G   
chr19_9002576_T_C   
chr1_45797487_A_G   0.012981216
chr1_45797153_A_T   0.010129176
chr1_45797750_C_T   0.024949931

나는 이미 언급했다awk - 2개 파일의 2개 열을 비교하고 공통 행을 인쇄합니다.하지만 일치하는 항목만 제공합니다.

답변1

먼저 읽고 fileB.txt첫 번째 필드를 키로 만들고 두 번째 필드를 배열의 값으로 만들고 FNR>1(를 사용하여 헤더 행을 건너뜁니다.NR과 FNR이란 무엇입니까? "NR==FNR"은(는) 무슨 뜻인가요?).

그런 다음 를 읽고 fileA.txt첫 번째 행의 헤더, 첫 번째 필드, 배열의 해당 요소(있는 경우)를 인쇄합니다.

awk '
    FNR==NR && FNR>1{a[$1]=$2}
    NR!=FNR{
        if(FNR>1){print $1,a[$1]}
        else{print "id", "freq.var"}
    }
' OFS="\t" fileB.txt fileA.txt

OFS="\t"출력 필드 구분 기호를 탭으로 설정합니다. 파일이 탭으로 구분되어 있으므로 출력 파일도 탭으로 구분되어야 한다고 가정합니다.

정렬을 위해 파이프로 연결할 수 있습니다 column -t.

답변2

원래 정렬 순서를 유지할 필요가 없으면 다음을 사용할 수 있습니다 join.

$ join -a1 -j1 -t$'\t' <(tail -n+2 fileA.txt | sort)  <(tail -n+2 fileB.txt | sort)
chr1_45796849_A_T   0.028399811
chr1_45796852_G_C   0.019154034
chr1_45796854_C_T   0.015872901
chr1_45797153_A_T   0.010129176
chr1_45797174_T_A
chr1_45797487_A_G   0.012981216
chr1_45797750_C_T   0.024949931
chr19_9002576_T_C
chr19_9018540_A_G

또는 헤더를 유지하세요.

$ ( printf 'id\tfreq.var\n'; join -t$'\t' -a1 -j1 <(tail -n+2 fileA.txt | sort)  <(tail -n+2 fileB.txt | sort))
id  freq.var
chr1_45796849_A_T   0.028399811
chr1_45796852_G_C   0.019154034
chr1_45796854_C_T   0.015872901
chr1_45797153_A_T   0.010129176
chr1_45797174_T_A
chr1_45797487_A_G   0.012981216
chr1_45797750_C_T   0.024949931
chr19_9002576_T_C
chr19_9018540_A_G

그리고 예쁜 지문도 있어요:

$ ( printf '%-20s\t%s\n' "id" "freq_var"; join -t$'\t' -a1 -j1 <(tail -n+2 fileA.txt | sort)  <(tail -n+2 fileB.txt | sort))
id                      freq_var
chr1_45796849_A_T   0.028399811
chr1_45796852_G_C   0.019154034
chr1_45796854_C_T   0.015872901
chr1_45797153_A_T   0.010129176
chr1_45797174_T_A
chr1_45797487_A_G   0.012981216
chr1_45797750_C_T   0.024949931
chr19_9002576_T_C
chr19_9018540_A_G

답변3

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
    map[(NR>1 ? $1 : "id")] = $2
    next
}
{ print $1, map[$1] }
$ awk -f tst.awk fileB fileA
id  freq.var
chr1_45796849_A_T   0.028399811
chr1_45796854_C_T   0.015872901
chr1_45797174_T_A
chr1_45796852_G_C   0.019154034
chr19_9018540_A_G
chr19_9002576_T_C
chr1_45797487_A_G   0.012981216
chr1_45797153_A_T   0.010129176
chr1_45797750_C_T   0.024949931

답변4

GNU sed확장 정규식 모드가 켜져 -E있고 자동 인쇄가 되지 않습니다 -n. 먼저 fileB를 읽고 예약된 공간에 저장합니다. 그런 다음 파일 A의 각 행을 비교하여 예약된 상태인지 확인합니다.

sed -En '
  1{
    s/^\S+/id/
    :filea
      H;n
    /\t/b filea
    x;s/$/\n/;x
  }
  G
  s/^([^\n]+)\n.*\n(\1\t[^\n]*)\n.*/\2/p;t
  s/\n.*/\t/p
' fileB.txt fileA.txt

결과:

id  freq.var
chr1_45796849_A_T   0.028399811
chr1_45796854_C_T   0.015872901
chr1_45797174_T_A   
chr1_45796852_G_C   0.019154034
chr19_9018540_A_G   
chr19_9002576_T_C   
chr1_45797487_A_G   0.012981216
chr1_45797153_A_T   0.010129176
chr1_45797750_C_T   0.024949931

관련 정보