다음과 같은 패턴 목록이 포함된 파일이 있습니다.
K00001
K00003
K00005
탭으로 구분된 테이블을 grep하고 다음과 같이 패턴을 인쇄하고 싶습니다(원래 테이블에는 빈 줄이 없습니다).
K00001 ko00010_Glycolysis__Gluconeogenesis
K00003 ko00010_Glycolysis__Gluconeogenesis
K00005 ko00010_Glycolysis__Gluconeogenesis
K00001 ko00020_Citrate_cycle_(TCA_cycle)
K00003 ko00020_Citrate_cycle_(TCA_cycle)
K00005 ko00020_Citrate_cycle_(TCA_cycle)
이것을 얻으세요: 한 줄에는 내 패턴 파일의 모든 패턴이 포함되어 있습니다.
K00001_ko00010_Glycolysis__Gluconeogenesis;K00001_ko00020_Citrate_cycle_(TCA_cycle)
K00003_ko00010_Glycolysis__Gluconeogenesis;K00003_ko00020_Citrate_cycle_(TCA_cycle)
K00005_ko00010_Glycolysis__Gluconeogenesis;K00005_ko00020_Citrate_cycle_(TCA_cycle)
답변1
솔루션은 다음을 사용합니다.앗. 두 개의 파일 이름을 인수로 전달하고 if (FNR == NR)
관용구를 사용하여 첫 번째 파일을 읽는지 두 번째 파일을 읽는지에 따라 다른 작업을 수행합니다. 우리는 사용할 것이다연관 배열버튼과 출력 라인을 저장합니다.
파일은 다음과 같습니다 a.awk
.
# usage: awk -f a.awk keyfile1 datafile2
BEGIN {
FS = "\t" # set field separator to TAB
}
{
if (FNR == NR) { # if looking at first (key) file
k[$1]=$1 # just save each key
} else { # if looking at second file
if ($1 in k) { # if first col is one that we want
output=$1 "_" $2 # prepare output line
if (out[$1]=="") # if first time we've seen this key
out[$1]=output # store output as is
else # and when we find more matches for this key
out[$1]=out[$1] ";" output # we append ";" and the output
}
}
}
END { # at the end
for (i in out) # print all the output lines
print out[i]
}
사용 방법은 다음과 같습니다.
$ awk -f a.awk file1 file2
K00001_ko00010_Glycolysis__Gluconeogenesis;K00001_ko00020_Citrate_cycle_(TCA_cycle)
K00003_ko00010_Glycolysis__Gluconeogenesis;K00003_ko00020_Citrate_cycle_(TCA_cycle)
K00005_ko00010_Glycolysis__Gluconeogenesis;K00005_ko00020_Citrate_cycle_(TCA_cycle)