Linux 터미널의 "마지막 열"에 0이 포함된 행을 삭제하는 방법은 무엇입니까?

Linux 터미널의 "마지막 열"에 0이 포함된 행을 삭제하는 방법은 무엇입니까?

"0".tsv마지막 열의 값이 여러 파일에 있는 경우(모든 파일의 마지막 열 번호가 동일하지 않을 수 있음) 행을 삭제하는 방법을 알고 싶습니다 . 총 열 수는 파일마다 크게 다릅니다.

awk정확하게 말하면 or 안에 있는 줄을 찾고 있어요 sed.

이것은 파일의 처음 몇 행과 열이며 .tsv, 마지막 열은 "0"삭제해야 할 열입니다. 그러나 마지막 열 번호는 모든 파일에 대해 동일하지 않습니다.

$cut -f1-10 temp_13jLiC.bed | awk '{c=0;for(i=4;i<=NF;++i){c+=$i};print $0, "", c}' | head -n 10 | sed 's/ /\t/g' 

chr1    0   100  .  .   .   .   .   .   .       0
chr1    100 200  .  .   .   .   .   .   .       0
chr1    200 300  .  .   .   .   .   .   .       0
chr1    300 400  .  .   .   .   .   .   .       0
chr1    400 500  .  .   .   .   .   .   .       0
chr1    500 600  .  .   .   .   .   .   .       0
chr1    600 700  .  .   .   .   .   .   .       0
chr1    700 800  .  .   .   .   .   .   .       0
chr1    800 900  .  .   .   .   .   .   .       0
chr1    900 1000 .  .   .   .   .   .   .       0

답변1

나는 무엇을 할 것인가:

awk '$NF != 0'

또는 bed는 탭으로 구분된 형식이므로 필드 내에 공백을 허용합니다.

awk -F'\t' '$NF != 0'

$NF자동으로 그리고 마술적으로 마지막 열입니다.

마지막 열이 0²이면 행이 인쇄되지 않습니다.


1 레코드에 하나 이상의 열이 있는 한. NF그렇지 않으면 0and $0( 변수와 혼동하지 않도록 $숫자에 적용되는 연산자 0)는 전체 레코드입니다.

² 엄밀히 말하면 이는 구현에서 인식되는 숫자 0의 표현입니다 awk. 여기에는 과 같은 것도 포함되지만 000때로는 구현이나 로케일 또는 환경에 따라 달라집니다 / , , 또는 . 텍스트만 허용하려면 다음으로 바꾸세요.-00E+12awk0.000,000x00x0p121e-5000XFFP-23450$NF != "0"

답변2

이것은 귀하의 파일이 어떻게 생겼는지 모르기 때문에 테스트되지 않은 추측이지만 GNU awk 또는 더 낮은 값으로 .bed설정된 다른 잘림을 사용하여 아마도 귀하가 원하는 것일 것입니다 .NF$0

awk 'BEGIN{FS=OFS="\t"} NR>10{exit} NF>10{NF=10} {c=0; for(i=4;i<=NF;++i) c+=$i} c{print $0, "", c}' temp_13jLiC.bed

설정의 효과 NF는 POSIX에서 정의되지 않은 동작이므로 NF를 10으로 설정해도 사용 중인 awk에서 필드 수가 10으로 잘리지 않는 경우 다음을 포함하여 모든 awk에서 작동하는 몇 가지 대안이 있습니다.

awk 'BEGIN{FS=OFS="\t"} NR>10{exit} {nf=(NF>10 ? 10 : NF); out=""; c=0; for(i=4;i<=nf;++i) {out=out $i OFS; c+=$i}} c{print out, c}' temp_13jLiC.bed

관련 정보