Я не уверен, почему вы указываете разделитель полей (FS
) вкладки (\t
). Это необходимо только в том случае, если у вас есть файл TSV (значения, разделенные табуляциями, аналогичные CSV). Если у вас действительно есть файл TSV, то есть есть пробелы в некоторых значениях и/или две последовательные вкладки указывают пустое поле в середине, вам нужно awk 'BEGIN {FS="\t"} …'
или короче awk -F '\t' '…'
.
Попробуйте это:
awk 'NF < 5' input
Если у вас есть формат TSV, который включает в себя несколько пустых полей, попробуйте следующее:
awk -F '\t' '$5 == ""' input
Вот более надежный тест учитывая неспособность HTML для представления закладки:
sample() {
echo 'chr6\t32945523\t32945792\tchr6:32945523-32945792\tBRD2-351|gc=50'
echo 'chr6\t32945892\t32946175\tchr6:32945892-32946175\tBRD2-352|gc=53.5'
echo 'chr6\t32946856\t32946981\tchr6:32946856-32946981'
echo 'chr6\t32947594\t32947919\tchr6:32947594-32947919\tBRD2-354|gc=51.2'
echo 'chr6\t32947594\t32947919\tchr6:32947594-32947919\t\ttest'
echo 'chr6\t32947594\t\tchr6:32947594-32947919\tBRD2-354|gc=51.2'
}
echo "unfiltered"
sample
echo "testing awk 'NF < 5'"
sample |awk 'NF < 5'
echo "\ntesting awk -F '\\\\t' '\$5 == \"\"'"
sample |awk -F '\t' '$5 == ""'
Последние две строки sample()
иллюстрируют разницу между awk
по умолчанию (FS="[ \t]+"
, соответствующий одному или нескольким символам пробела) и FS="\t"
.
С по умолчанию вы получите эту короткую линию плюс окончательную строку, так как пробелы между полями 3 и 5 сбрасываются (поле 5 TSV равно, поле 4). Строка «тест» сворачивает поле TSV 6 в поле awk
, поэтому по умолчанию его пропускает.
Измененный разделитель полей также получит эту короткую линию. Он будет подсчитывать поля для TSV, отмечая, что строка «test» имеет пустую пятую запись («test» - ее шестой элемент), а третье поле последней линии отмечено как пустым, а не сбрасывается, поэтому значение «BRD2» равно правильно отмечен как пятое поле TSV.
unfiltered
chr6 32945523 32945792 chr6:32945523-32945792 BRD2-351|gc=50
chr6 32945892 32946175 chr6:32945892-32946175 BRD2-352|gc=53.5
chr6 32946856 32946981 chr6:32946856-32946981
chr6 32947594 32947919 chr6:32947594-32947919 BRD2-354|gc=51.2
chr6 32947594 32947919 chr6:32947594-32947919 test
chr6 32947594 chr6:32947594-32947919 BRD2-354|gc=51.2
testing awk 'NF < 5'
chr6 32946856 32946981 chr6:32946856-32946981
chr6 32947594 chr6:32947594-32947919 BRD2-354|gc=51.2
testing awk -F '\t' '$5 == ""'
chr6 32946856 32946981 chr6:32946856-32946981
chr6 32947594 32947919 chr6:32947594-32947919 test
Вместо этого тест для NF == 4 – stark
Ваша программа отлично подходит для меня --- Вы абсолютно уверены, что ваши поля разделены табуляцией? Также, если вам нравится, вы можете записать его немного короче, как 'awk 'BEGIN {FS =" \ t "}! $ 5''.И поскольку кажется, что ваши поля не имеют внутренних пространств, 'awk '! $ 5'', вероятно, тоже это сделает. – jas
'awk '! $ 5'' потерпит неудачу, если значение' $ 5' оценивается численно до нуля. @Chris для отладки, запустите этот скрипт: 'tr '\ t' '#'