예를 들어, 2개의 열이 있는 파일이 있습니다.
$ cat data
a4 b1
a4 c2
a4 b4
z4 c2
두 개의 열을 일치시키고 싶습니다. 예를 들어 (column1 = a4 and column2 = b1)
OR (column1 = a4 and column2 = c2)
이면 열 3의 출력은 다음과 같아야 합니다.
(원하는 출력):
a4 b1 matched
a4 c2 matched
a4 b4 -
z4 c2 -
그래서 내 논리를 1liner awk에 병합하려고 했습니다.
$ awk '{print $1, $2, (($1 = a4 && $2 = b1) || ($1 = a4 && $2 = c2) ? "a4-matched" : "-")}' data
세 번째 열 전체에 대해 awk 구문이 잘못되었거나 다른 것이 누락된 것 같습니다. 결과는 다음과 같습니다.
a4 b1 -
a4 c2 -
a4 b4 -
z4 c2 -
답변1
거의 다 왔지만 구문 오류가 발생한 것 같습니다. $1=a4
첫 번째 열이 같은지 확인하는 대신 a4
변수의 내용(정의되지 않았으므로 비어 있음)을 첫 번째 열에 할당하여 해당 내용을 덮어씁니다. (당신이 눈치채지 못하도록 인쇄한 것) 또한 초기화되지 않은 변수가 "false"로 평가되기 때문에 "false"로 평가됩니다. 다른 비교에서도 마찬가지입니다. 이것이 바로 "일치" 조건을 "참"으로 취급하지 않는 이유입니다.awk
a4
(사소한) 필요한 수정을 마친 후 프로그램은 다음과 같습니다.
awk '{if (($1=="a4" && $2=="b1") || ($1=="a4" && $2=="c2")) $3="matched"; else $3="-"} 1' data.txt
작동 방식은 다음과 같습니다.
- 각 행에 대해 언급한 조건이 충족되는지 확인하고제삼
$3
또는 로 설정하여-
열에서 행으로 이동합니다matched
. - 그런 다음 수정 사항을 포함하여 현재 줄을 인쇄합니다. 이것은방황하는 듯
1
규칙 블록 외부 -awk
규칙 외부에서 "true"로 평가되는 조건이 발견되면 이전 수정 사항을 포함하여 현재 줄이 인쇄됩니다.
위의 프로그램은 이해를 쉽게 하고 이를 보여주기 위해 명시적으로 작성되었습니다. "허용된" 두 사례 모두에 대해 조건이 $1
동일하기 때문에 귀하의 경우에는 단축될 수 있습니다 $2
.
awk '{if ($1=="a4" && ($2=="b1" || $2=="c2")) $3="matched"; else $3="-"} 1' data.txt
awk
또한 필드를 수정하면 출력 필드 구분 기호(기본값은 공백 1개)를 사용하여 개별 필드에서 행이 다시 작성되므로 입력 필드가 여러 공백으로 구분되면 원래 서식이 삭제됩니다. 이것이 문제인 경우, 대신 인쇄해야 하지만 이미 선택한 "추가" 전략을 채택해야 합니다.$0, ( your conditional string )
$1, $2, ( your conditional string )
답변2
$ awk '{print $0, ($1=="a4" && ($2 ~ /^(b1|c2)$/) ? "matched" : "-")}' file
a4 b1 matched
a4 c2 matched
a4 b4 -
z4 c2 -
답변3
$1
두 경우 모두 조건이 동일하고 $2
옵션에 따라 여러 번 확인하므로 두 번, 한 번 확인할 필요가 없습니다 . 새 필드를 할당하면 awk
필드가 기본값(단일 공백 문자)으로 다시 작성되므로 입력에 공백이 있는 경우 연속 공백이 하나로 압축됩니다.$0
OFS
awk '{ print $0, ($1=="a4" && ($2=="b1" || $2=="c2")?"matched":"-") }' infile