Как работает эта команда awk? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть указанные ниже данные в файле, и я хочу разделить строки на две переменные - одна с информацией о версии, а вторая без информации о версии:

3f0e86dd5592                             1969-12-31T19:00:00
0cbf659a22db                             1969-12-31T19:00:00
9dd121133805  1.0.48                     1969-12-31T19:00:00
4daa44734d2e  1.0.45,1.0.47,1.0.42       1969-12-31T19:00:00

Если я бегу ниже, я не буду t получить желаемый результат (который, я думаю, должен дать мне строки без информации о версии).

awk '{ if ($2 == "") { print } }' file.txt 

Но при запуске ниже я получаю строки без версии:

awk '{ if ($3 == "") { print } }' file.txt 

Почему?

Ответы [ 3 ]

3 голосов
/ 26 мая 2020

Для данных фиксированной ширины, если вы используете GNU awk, вы можете определить размер каждого поля. Тогда пустые поля будут состоять только из пробелов:

gawk 'BEGIN {FIELDWIDTHS = "14 27 19"} $2 ~ /^[[:space:]]+$/' file
3f0e86dd5592                             1969-12-31T19:00:00
0cbf659a22db                             1969-12-31T19:00:00
1 голос
/ 25 мая 2020

В этих строках разное количество полей. Первые две строки содержат по 2 поля, а следующие две - по 3 поля в каждой. Используйте NF==3 в качестве условия. $3=="" не имеет смысла.

0 голосов
/ 26 мая 2020

если я понимаю ваш вопрос, вы сделаете его образец с NF == 2. Если вы заметили какую-либо ошибку, пожалуйста, исправьте меня

awk 'NF==2{print}' file

или:

awk '{if(NF==2) print}' file

ввод:

3f0e86dd5592                             1969-12-31T19:00:00
0cbf659a22db                             1969-12-31T19:00:00
9dd121133805  1.0.48                     1969-12-31T19:00:00
4daa44734d2e  1.0.45,1.0.47,1.0.42       1969-12-31T19:00:00

вывод:

3f0e86dd5592                             1969-12-31T19:00:00
0cbf659a22db                             1969-12-31T19:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...