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”吗?
谢谢。
答案 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
最诚挚的问候。