awk命令转换文件

时间:2016-07-08 09:06:08

标签: shell awk

以下是文件内容和使用的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

获取语法错误。我可以请你帮忙吗?

5 个答案:

答案 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)防止多行输入/输出出现某些错误(有关getlineclose()的讨论,请参见ability
  • print $3"|"mydate","$8输出用竖线和逗号分隔的原始行的内容,并使用新的“ mydate”值替换字段2。