2016-03-19 3 views
0

В нижеуказанном input файле Я использую awk для распечатки строк blank в $5. awk выполняет запуск и вывод результатов, но это весь входной файл, а не только пустые строки. Моя awk версия GNU 4.0.1. Спасибо :)печатать строки с пробелом в файле с помощью awk

вход

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 32946856 32946981  chr6:32946856-32946981 

AWK

cat input | awk 'BEGIN {FS="\t"} $5=="" {print}' 

выходной ток

cat input | awk 'BEGIN {FS="\t"} $5=="" {print}' 
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 32948108 32948251  chr6:32948108-32948251  BRD2-355|gc=43 

редактировать: Ниже awk работает, но я не знаю, почему оригинал не

awk '$5==""' input 
+3

Вместо этого тест для NF == 4 – stark

+1

Ваша программа отлично подходит для меня --- Вы абсолютно уверены, что ваши поля разделены табуляцией? Также, если вам нравится, вы можете записать его немного короче, как 'awk 'BEGIN {FS =" \ t "}! $ 5''.И поскольку кажется, что ваши поля не имеют внутренних пространств, 'awk '! $ 5'', вероятно, тоже это сделает. – jas

+1

'awk '! $ 5'' потерпит неудачу, если значение' $ 5' оценивается численно до нуля. @Chris для отладки, запустите этот скрипт: 'tr '\ t' '#'

ответ

1

Я не уверен, почему вы указываете разделитель полей (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 
+0

Спасибо всем :) – Chris

Смежные вопросы