결과

결과

다음과 같이 탭으로 구분된 데이터 세트가 있습니다.

#1 2      3   4  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 10024 10395 41 K + 2 1 1 12 14  5  0  0  3  1  3  6 2 
1 10679 10795 51 P + 2 1 1 15 14  3  0  0  2  1  2  3 1 

열 7-19를 기반으로 한 값을 저장하기 위해 열($20)을 하나 더 추가하고 싶습니다. 열의 숫자가 0이 아니면 하나를 추가합니다. 예상 출력:

#1 2      3   4  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 10024 10395 41 K + 2 1 1 12 14  5  0  0  3  1  3  6 2  11
1 10679 10795 51 P + 2 1 1 15 14  3  0  0  2  1  2  3 1  11

awk를 사용하여 명령을 작성하는 방법은 무엇입니까?

답변1

7번째 필드부터 반복하여 이 필드의 값이 0인지 확인하고 그렇지 않은 경우 계속해서 20번째 필드에 1을 추가합니다.

awk -F '\t' 'NR==1 {$(NF+1)=NF+1; print; next}; \
            {for(i=7; i<NF; i++) if ($i != 0) $20++}; 1' OFS='\t' file.txt

첫 번째 레코드( NR==1)의 경우 추가 필드 헤더가 마지막 필드로 추가되고 현재 에 1이 추가됩니다 NF.

답변2

perl -aF'\t' -lpe '$_ .= "\t" . ($. == 1 ? @F+1 : grep $_, @F[6..$#F])' data.set

줄 끝에 다른 필드를 추가해야 하므로 .=현재 레코드에 연산자를 사용합니다 $_. 첫 번째 레코드의 특별한 경우에는 @F+1스칼라 컨텍스트에서 현재 필드 수에 1을 더한 것으로 해석되는 표현식을 추가하기만 하면 됩니다.

헤더가 아닌 레코드의 경우 표현식은 grep $_, @F[6..$#F]7번째 요소를 배열의 마지막 요소 @F(옵션을 통해 지정된 탭 필드 구분 기호를 사용하여 레코드에서 잘라냄)까지 반복한다는 의미 -F'\t'입니다. 스칼라 컨텍스트에서는 A 조건을 반환합니다( 경우) $_7번째부터 슬라이스의 마지막 요소까지 0이 아닌 요소를 나타냅니다.


결과

#1 2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
1  10024 10395 41 K  +  2  1  1  12 14 5  0  0  3  1  3  6  2  11
1  10679 10795 51 P  +  2  1  1  15 14 3  0  0  2  1  2  3  1  11

관련 정보