이전 값을 기반으로 열 값을 다시 코딩합니다.

이전 값을 기반으로 열 값을 다시 코딩합니다.
1859115 2258379 24636 Yes 06S14028968 13 1 1 2
1859115 2258379 24636 Yes 06S14028968 13 1 1 2
1859116 2255037 21608 Yes 06S14028969 11 0 2 3
1859117 2268746 34027 Yes 06S14028970 10 0 2 1

위는 내 데이터 세트의 예입니다. 1을 2로 바꾸고 0을 1로 바꾸는 방식으로 7번째 열의 값을 바꾸고 싶습니다. 그래서 제가 기대하는 결과는 다음과 같습니다.

1859115 2258379 24636 Yes 06S14028968 13 2 1 2
1859115 2258379 24636 Yes 06S14028968 13 2 1 2
1859116 2255037 21608 Yes 06S14028969 11 1 2 3
1859117 2268746 34027 Yes 06S14028970 10 1 2 1

나는 이 접근법을 사용해 보았습니다.

awk 'NR==1{$10="Pheno";print;next}\
 $7 == "1" {$10="2"};\
 $7 == "0" {$10="1"}1'  old.txt |column -t > new.txt

그런 다음 첫 번째 행을 제거합니다. 하지만 직접적인 방법이 필요합니다.

답변1

열 7 번째 값이 항상 0 또는 1이면 다음을 사용할 수 있습니다.

awk 'NR>1{ $7+=1 }1' infile

그렇지 않은 경우 값이 0 또는 1인지 확인하십시오.

awk 'NR>1 && $7 ~/^[01]$/ { $7+=1 }1' infile

수정된 값을 코드의 새 열로 추가하는 것 같습니다. 새 열에 인쇄해야 하는 경우 열 7번째 이 항상 0 또는 1이라는 동일한 가정으로 다음을 수행합니다.

awk '{ print $0, (NR==1?"Pheno":++$7) }' infile

그렇지 않으면:

awk '{ print $0, (NR==1?"Pheno":($7 ~/^[01]$/?++$7:"NA") ) }' infile

참고: $7 ~/^[01]$/로 변경 ($7==1 || $7==0)하면 단일 정수 숫자 0 또는 1만 확인하는 이전 숫자( )를 사용하는 대신 해당 값이 실제로 숫자인지 $7 ~/^[01]$/확인하므로 결과적으로 1.0or 0.0또는 숫자 와 같은 부동 소수점 숫자에는 작동하지 않습니다. 000또는 001등과 같은 앞에 0이 있습니다 .

관련 정보