awk как найти первое доступное поле даты? - PullRequest
0 голосов
/ 25 ноября 2018
Fields 1,2,3,4 are date fields yyyy-mm-dd. 
Delimited by ";"
"-" if no date.
Field 4 will always have a date

Примеры;

-; 2016-08-19; 2016-08-19; 2018-07-17; Beach-Rangiroa.jpg
-; -; -; 2018-09-12; MV3_0034-copy.webp
2016-12-10; 2016-12-10; 2016-12-20; 2018-07-18; Sukhothai-61.jpg
-; -; -; 2018-07-19; Gdu9Rwhu6W3Q5W6q_1Qag.jpg

Цель : используйте awk для печати первой доступной даты в полях заказа 1,2,3,4

Iя пробовал это;

awk -F";" '{if ($1!="-") print $1; else if ($2!="-") print $2; else if ($3!="-") prin$3; else if ($4!="-") print $4}'

Results ...

 2016-08-19
 -
 -

bash version 4.3.48

Я пытаюсь добиться этого: например, строка 1 в примере...

2016-08-19;Beach-Rangiroa.jpg

echo '-; -; -; 2018-07-15; Stock-Photo-114398301.webp; WEBP; image/webp; 2000; 1333' | \
awk -F';' 'OFS=";" {for(i=1; i<5; ++i) { if ($i ~ /[0-9]{4}-[0-9]{,2}-[0-9]{,2}/) { print $i,$5,$6,$7,$8,$9; next; }}}'

Результат;

2018-07-15;Фото-Photo-114398301.webp;WebP;изображение / WebP;2000;1333

Это работает хорошо, кроме 1-го пробела в дате, также есть метод, доступный для проверки даты, например, дата -d "% Y-% m-% d"?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 25 ноября 2018

Спасибо всем за вашу помощь.

Я думаю, что это соответствует цели;

echo '-; -; -; 2018-07-25; Redwood-Forest-Sequoia-4.jpg; JPEG; image/jpeg; 1280; 720' | \
awk -F'; ' 'OFS="; " {for(i=1; i<5; ++i) { if ($i ~ /[0-9]{4}-[0-9]{,2}-[0-9]{,2}/) { print $i,$5,$6,$7,$8,$9; next; }}}'

Результат;

2018-07-25; Redwood-Forest-Sequoia-4.jpg; JPEG; image/jpeg; 1280; 720

С уважением.

0 голосов
/ 25 ноября 2018

Решение без awk:
Вы сказали, что хотите первую доступную дату.Если вам требуется вывод только 1 строки, вы можете использовать

grep -Eo "[0-9]{4}-[0-9]{2}-[0-9]{2}" inputfile| head -1

Если вы хотите, чтобы в каждой строке была первая дата, измените grep или используйте sed:

grep -Eo "[0-9]{4}-[0-9]{2}-[0-9]{2}.*" inputfile| cut -d';' -f1
# or
sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/; s/.*([0-9]{4}-[0-9]{2}-[0-9]{2})/\1/' inputfile
0 голосов
/ 25 ноября 2018

Это решение только для GNU gawk, использующее FPAT:

awk 'BEGIN{FPAT="[0-9]{4}-[0-9]{,2}-[0-9]{,2}"}{print $1}' file1
2016-08-19
2018-09-12
2018-07-19

С FPAT вы фактически указываете gawk, что считать полем, здесь есть целое регулярное выражение.Если во входной строке также есть вторая дата, она будет отображаться как $2, $NF вернет поле последней даты каждой строки, NF вернет поля общей даты и т. Д.

0 голосов
/ 25 ноября 2018

Вы можете использовать переменную для номеров полей:

awk -F\; '{for(i=1; i<5; ++i) { if ($i ~ /[0-9]/) { print $i; next; }}}' in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...