"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
그렇지 않으면 0
and $0
( 변수와 혼동하지 않도록 $
숫자에 적용되는 연산자 0
)는 전체 레코드입니다.
² 엄밀히 말하면 이는 구현에서 인식되는 숫자 0의 표현입니다 awk
. 여기에는 과 같은 것도 포함되지만 000
때로는 구현이나 로케일 또는 환경에 따라 달라집니다 / , , 또는 . 텍스트만 허용하려면 다음으로 바꾸세요.-0
0E+12
awk
0.00
0,00
0x0
0x0p12
1e-500
0XFFP-2345
0
$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