awk如何找到第一个可用的日期字段?

时间:2018-11-25 08:59:17

标签: bash awk

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

中打印第一个可用日期

我已经尝试过了

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

结果...

 2016-08-19
 -
 -

bash版本4.3.48

我正在努力实现这一目标:例如示例中的第1行...

2016-08-19;海滩-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; Stock-Photo-114398301.webp; WEBP;图片/ Webp; 2000; 1333

这很好用,除了日期的第一个空格外,还有一种方法可以验证日期,例如date -d“%Y-%m-%d”吗?

谢谢。

4 个答案:

答案 0 :(得分:1)

这是使用gawk的仅限gnu的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将返回总日期字段,依此类推。

答案 1 :(得分:0)

您可以将变量用于字段编号:

awk -F\; '{for(i=1; i<5; ++i) { if ($i ~ /[0-9]/) { print $i; next; }}}' in

答案 2 :(得分:0)

无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

答案 3 :(得分:0)

谢谢大家的帮助。

我认为这完成了目标;

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

最诚挚的问候。