awk сохранить заголовок при использовании IGNORECASE - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть CSV-файл. Я хочу найти строку в определенном столбце columnB (столбец 5 в моем наборе данных) (регистр игнорируется) и применить фильтр к другому columnC (столбец 10 в моем наборе данных),Затем сохраните выбранные столбцы в файл.

выборка набора данных

columnA     columnB    columnC  columnD
abc          Apple      100     today
nbd          apple      50      tomorrow
ccc          apple      101     today

желаемый вывод

columnB    columnC
Apple      100
apple      101

проблема при использовании awk я могу выбрать columnB, но я не могу вывести заголовок.

 awk 'BEGIN {IGNORECASE = 1} {if($5 == "Apple") print $0 }' Data.csv> testPipe.txt

Я пытался использовать NR==1, но по какой-то причине он не работает с IGNORECASE.

Я такжепопробовал методы здесь и здесь .

Я попытался использовать grip, я могу вывести заголовок, но я не могу указать columnB для строкисоответствие. И поиск будет применен ко всем столбцам.

cat Data.csv |{ head -1; grep -I "Apple";} | awk -F',' '{ if ($10 >100 ) { print } }'>testPipe.txt

Есть ли способ объединить оба метода и получить желаемый результат?Спасибо

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Используйте функцию tolower():

awk 'NR==1{print; next} tolower($5) == "apple"' file

Объяснение:

# Print the headers
NR==1 {
    print
    next
}

# Print the current line if $5 matches the condition
# Note that if there is no action specified, awk will
# use print $0 by default
tolower($5)

Если вы хотите написать дополнительные действия, если условие истинно, поместите их в блок

tolower($5) {
    ...
}

В отличие от IGNORECASE, который работает только с GNU awk, tolower() будет работать с любой версией awk, поскольку она определяется POSIX.

0 голосов
/ 22 сентября 2019

добавьте следующее к вашему предложению BEGIN, до или после установки IGNORECASE:

getline;
print;

объяснение: предложение BEGIN выполняется один раз перед всем остальным, поэтому вы можете обрабатывать строки и там, но вынужно прочитать их вручную.

полный пример:

awk '
    BEGIN {
        getline;
        print;
        IGNORECASE = 1;
    }

    $2 == "apple" && $3 <= 100 {
        print $1;
    }
'
...