5개의 열과 여러 행이 있는 테이블이 있습니다.
마지막 열에는 각 행의 모든 값의 합계가 포함됩니다.
그렇게:
A B C D E
gene1 1 3 5 9
gene2 0 0 4 4
gene3 1 0 1 2
gene4 5 5 0 10
gene5 2 0 0 2
내가 원하는 것은 gene2와 gene5 라인을 별도의 파일로 추출하고 다른 유전자(추출된 유전자는 아님), gene1, gene3 및 gene4를 포함하는 다른 파일을 갖는 것입니다.
명령 을 사용하려고 하는데 awk
행과 숫자를 연결하는 방법을 모르겠습니다.
답변1
사용 awk
:
awk '{
if ( ($2 == $5 && $3 + $4 == 0) || ($3 == $5 && $2 + $4 == 0) || ($4 == $5 && $2 + $3 == 0) ) {
print $0 > "match-file"
} else if ($2 + $3 + $4 == $5) {
print $0 > "nomatch-file"
}
}' input
답변2
(매우 유사한) 대안:
awk '{
if ( $2 == $5 || $3 == $5|| $4 == $5 ) {
print $0 > "match-file"
} else if ($2 + $3 + $4 == $5) {
print $0 > "nomatch-file"
}
}' input
답변3
Using GNU awk:
$ awk 'NR>1{
t = gensub(/ /, " ", "g")
f = gsub(/ 0 /, "", t) > 1 ? "File1" : "File2"
print $0 > f
}' file
모든 Posix sed 구조를 사용하여 다음을 수행할 수 있습니다.
$ sed -ne '
1b
s/[[:blank:]]0[[:blank:]]/&/2w File1
t
s/^//w File2
' file
sed를 모드로 실행하면 -n
모드 공간이 기본적으로 인쇄되지 않습니다. 헤더 행을 건너뛰고 첫 번째 행으로 간주합니다.
헤더가 아닌 행에서 두 개 이상의 분리된 0을 볼 수 있는 경우 => 마지막 열은 2, 3 또는 4개 열 중 하나와 일치해야 합니다. 이는 마지막 열이 2, 3, 4열의 합이기 때문입니다.
선행 또는 후행 공백이 없다고 가정합니다.
일치하는 레코드를 찾기 위해 결과가 File1에 덤프됩니다. 나머지는 File2입니다. 헤더가 두 출력 모두에 존재하지 않습니다.
답변4
줄에서 2개의 (선행) 0을 찾고 있는 것 같습니다. 이 경우 다음을 시도하십시오.
awk '{if (NR==1){print > "match"; print > "nomatch"}
else
{if ($0 ~ / 0.* 0/) {print > "match"} else {print > "nomatch"}}}' file1