以下是文件内容和使用的awk命令:
输入文件:in_t.txt
1,ABC,SSS,20-OCT-16,4,1,0,5,0,0,0,0
2,DEF,AAA,20-JUL-16,4,1,0,5,0,0,0,0
预期的outfile:
SSS|2016-10-20,5
AAA|2016-07-20,5
我尝试了以下命令:
awk -F , '{print $3"|"$(date -d 4)","$8}' in_t.txt
将outfile设为:
SSS|20-OCT-16,5
AAA|20-JUL-16,5
我唯一想知道的是如何使用相同的awk命令格式化日期。试过
awk -F , '{print $3"|"$(date -d 4)","$8 +%Y-%m-%d}' in_t.txt
获取语法错误。我可以请你帮忙吗?
答案 0 :(得分:3)
最好在shell中执行此操作,并使用date -d
转换date
格式:
#!/bin/bash
while IFS=',' read -ra arr; do
printf "%s|%s,%s\n" "${arr[2]}" $(date -d "${arr[3]}" '+%Y-%m-%d') "${arr[7]}"
done < file
SSS|2016-10-20,5
AAA|2016-07-20,5
答案 1 :(得分:2)
您对单个命令的定义是什么?对awk的调用是一个shell命令。这可能是你想要的:
$ awk -F'[,-]' '{ printf "%s|20%02d-%02d-%02d,%s\n", $3, $6, (match("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",$5)+2)/3, $4, $10 }' file
SSS|2016-10-20,5
AAA|2016-07-20,5
顺便说一句,记住 awk不是shell 非常重要。你不能直接从awk调用shell工具(例如date
)。你写的$(date -d 4)
awk看到一个名为date
的未设置变量(数值) 0
)您从中提取了一个名为d
(也是0
)的未设置变量的值,以获取数字结果0
,然后将其与数字{{1}连接起来获取4
然后应用04
运算符来获取字段$
(= $04
)的内容。输出与shell命令$4
无关。
答案 2 :(得分:1)
来自Unix.com
稍微调整一下以满足您的需求
awk -v var="20-OCT-16" '
BEGIN{
split("JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC", month, " ")
for (i=1; i<=12; i++) mdigit[month[i]]=i
m=toupper(substr(var,4,3))
dat="20"substr(var,8,2)"-"sprintf("%02d",mdigit[m])"-"substr(var,1,2)
print dat
}'
2016-10-20
<强>解释强>
Prefix 20 {20}
Substring from 8th position to 2 positions {16}
Print - {-}
Check for the month literal (converting into uppercase) and assign numbers (mdigit) {10}
Print - {-}
Substring from 1st position to 2 positions {20}
答案 3 :(得分:1)
这对你也有用。
awk -F , 'BEGIN {months = " JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"}
{ num = index(months, substr($4,4,3)) / 3
if (length(num) == 1) {num = "0" num}
date = "20" substr($4,8,2) "-" num "-" substr($4,1,2)
print $3"|" date "," $8}' in_t.txt
答案 4 :(得分:0)
您很接近致电date
的电话。实际上,您可以将其与getline
一起使用来解析并输出日期值:
awk -F',' '{
parsedate="date --date="$2" +%Y-%m-%d"
parsedate | getline mydate
close(parsedate)
print $3"|"mydate","$8
}'
说明:
-F','
将字段分隔符(定界符)设置为逗号parsedate="date --date="$2" +%Y-%m-%d"
利用date
的{{3}}将第二个字段转换为给定的输出格式,并将该命令分配给变量“ parsedate” parsedate | getline mydate
运行您的自定义“ parsedate”命令,并将输出分配给mydate
变量close (parsedate)
防止多行输入/输出出现某些错误(有关getline
和close()
的讨论,请参见ability)print $3"|"mydate","$8
输出用竖线和逗号分隔的原始行的内容,并使用新的“ mydate”值替换字段2。