Почему awk не фильтрует первый столбец в первой строке моих файлов? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть файл со следующими записями:

depots/import/HDN1YYAA_15102018.txt;1;CAB001
depots/import/HDN1YYAA_20102018.txt;2;CLI001
depots/import/HDN1YYAA_20102018.txt;32;CLI001
depots/import/HDN1YYAA_25102018.txt;1;CAB001
depots/import/HDN1YYAA_50102018.txt;1;CAB001
depots/import/HDN1YYAA_65102018.txt;1;CAB001
depots/import/HDN1YYAA_80102018.txt;2;CLI001
depots/import/HDN1YYAA_93102018.txt;2;CLI001

Когда я выполняю следующий oneliner awk:

cat lignes_en_erreur.txt | awk 'FS=";"{ if(NR==1){print $1}}END {}'

вывод не ожидается:

 depots/import/HDN1YYAA_15102018.txt;1;CAB001

Хотя я полагаю, получаю только первый столбец:

Если я пропущу все записи:

cat lignes_en_erreur.txt | awk 'FS=";"{ if(NR>0){print $1}}END {}'

, тогда фильтрация начнется только после второй строки, и яполучить следующий вывод:

depots/import/HDN1YYAA_15102018.txt;1;CAB001
depots/import/HDN1YYAA_20102018.txt
depots/import/HDN1YYAA_20102018.txt
depots/import/HDN1YYAA_25102018.txt
depots/import/HDN1YYAA_50102018.txt
depots/import/HDN1YYAA_65102018.txt
depots/import/HDN1YYAA_80102018.txt
depots/import/HDN1YYAA_93102018.txt

Кто-нибудь знает, почему awk пропускает только первую строку.Я попытался удалить первую запись, но поведение такое же, она пропустит первую строку.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Во-первых, это должно быть

awk 'BEGIN{FS=";"}{ if(NR==1){print $1}}END {}' filename

Вы можете опустить блок END, если он пуст:

awk 'BEGIN{FS=";"}{ if(NR==1){print $1}}' filename

Вы можете использовать аргумент командной строки -F, чтобы установитьразделитель полей:

awk -F';' '{if(NR==1){print $1}}' filename

Кроме того, программы awk состоят из последовательности CONDITION [{ACTIONS}] элементов, вы можете опустить if:

awk -F';' 'NR==1 {print $1}' filename
0 голосов
/ 22 октября 2018

cut может быть лучше подходит для всех строк

$ cut -d';' -f1 file

, чтобы пропустить первую строку

$ sed 1d file | cut -d';' -f1

, чтобы получить только первую строку

$ sed 1q file | cut -d';' -f1

однако в этот момент лучше переключиться на awk

, если у вас большой файл и вас интересует только первая строка, лучше выйти рано

$ awk -F';' '{print $1; exit}' file
0 голосов
/ 22 октября 2018

Необходимо указать разделитель в блоке BEGIN или в командной строке:

awk 'BEGIN{FS=";"}{ if(NR==1){print $1}}'
awk -F ';' '{ if(NR==1){print $1}}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...