
내 데이터는 다음과 같습니다.
A 4 G 1 G 1
C 4 C 2 C 2
T 6 T 5 T 5
A 6 T 2 T 2
C 6 T 2 T 2
T 6 G 2 G 2
나는 명령을 시도하고 있습니다 :
awk -F " " '$1==$3 {$7=$6; print $0;}
$1==$5 {$7=$4; print $0;}
($1 != $3 && $1 != $5) {$7=$2; print $0}' test.txt
데이터에는 5개의 행만 있지만 출력에는 7개의 행이 있으며 일부 행은 무작위로 반복됩니다.
어떻게든 이런 일은 이 데이터세트에서만 발생하고 내가 가지고 있는 다른 데이터세트에서는 발생하지 않습니다. 누구든지 도와줄 수 있나요? 무슨 일이 일어났는지 이해가 안 돼요
답변1
원하는 동작 방식을 정확하게 설명하지 않았으므로 여기서 몇 가지 추측을 해보겠습니다.
중복된 행을 살펴보세요.
C 4 C 2 C 2
$1은 $3과 동일하므로 첫 번째 블록이 실행됩니다. $1은 $5와 동일하므로 두 번째 블록이 트리거됩니다.
입력 라인당 하나의 출력 라인만 원하는 경우 데이터를 한 곳에만 출력하십시오.
awk -F " " '$1==$3 {$7=$6;}
($1==$5) {$7=$4; }
($1 != $3 && $1 != $5) {$7=$2}
($7 != "") { print $0 }' test.txt
나는 이것이 당신이 찾고 있는 동작이라고 생각하지만 입력과 동일하거나 더 적은 수의 출력 라인을 생성합니다. 모든 입력 라인에 대해 한 라인의 출력을 원하는 경우 마지막 블록에서 조건을 제거하십시오.
답변2
awk -F " " '$1==$3 {$7=$6; print $0;} $1==$5 {$7=$4; print $0;} ($1 != $3 && $1 != $5) {$7=$2; print $0}' test.txt
예를 들어, 과 가 $1==$3
모두 $1==$5
참이면 처음 두 블록이 모두 실행되고 인쇄됩니다. 2호선과 3호선의 경우입니다. 두 블록 모두 서로 다른 두 필드에서 $7를 설정하지만 여기서는 두 줄의 값이 동일합니다.
각 줄을 최대 한 번만 인쇄하려면 분기에서 플래그를 설정하고 해당 플래그에 따라 인쇄(또는 인쇄하지 않음)할 수 있습니다. 예를 들면 다음과 같습니다.
awk -F " " '{ p=0; }
$1==$3 {$7=$6; p=1}
$1==$5 {$7=$4; p=1}
($1 != $3 && $1 != $5) {$7=$2; p=1}
p {print}' test.txt
print
$0
다른 인수가 제공되지 않으면 인쇄되며, p
기본 동작이므로 마지막에 코드 블록을 실제로 사용할 수 없습니다.
1
마찬가지로 각 줄을 무조건 인쇄하려면 일반적으로 다음 과 같은 후행만 표시됩니다.awk '/.../ { ... } 1'
$7
하지만 세 가지 분기 모두 필드를 서로 다른 값으로 설정하므로 필드를 어떻게 처리할지 결정해야 합니다 .
블록 중 하나만(최대) 실행하려는 경우 next
각 블록 내의 명령문을 사용하여 다음 줄로 이동할 수 있습니다.
awk -F " " '$1==$3 {$7=$6; print; next}
$1==$5 {$7=$4; print; next}
($1 != $3 && $1 != $5) {$7=$2; print; next}
' test.txt
...실제로 조건을 살펴보면 처음 두 조건이 거짓인 경우에만 마지막 조건이 참인 것 같습니다. 따라서 모두 if-else로 작성하는 것이 좋습니다.
awk -F " " '{ if ($1==$3) { $7=$6 };
else if ($1==$5) { $7=$4 };
else { $7=$2 };
print;
}' test.txt