我需要从朱利安(yyddd或yyJJJ)转换为yyyymmdd的csv文件的第7个字段。我有下面的做循环。为了更快地处理,我需要使用awk命令的相同逻辑。有人能帮忙吗?
count=0
while read -r line1; do
col_7=$( echo $line1 | cut -d ',' -f7 | cut -c4-6)
year1=$( echo $line1 | cut -d ',' -f7 | cut -c2-3)
echo $col_7
col_1=$( echo $line1 | cut -d ',' -f1,2,3,4,5,6)
col_8=$( echo $line1 | cut -d ',' -f8 )
date7=$(date -d "01/01/${year1} +${col_7} days -1 day" +%Y%m%d)
echo $date7
echo $col_1,$date7,$col_8 >> ${t2}
count=$[count+1]
done < ${t1}输入
xx,x,x,xxx,xxxx,xxxxx,021276,x
xx,x,x,xxx,xxxx,xxxxx,021275,x
xx,x,x,xxx,xxxx,xxxxx,021275,x 输出
xx,x,x,xxx,xxxx,xxxxx,20211003,x
xx,x,x,xxx,xxxx,xxxxx,20211002,x
xx,x,x,xxx,xxxx,xxxxx,20211002,x 发布于 2022-02-23 18:12:03
以下是awk的解决方案。这需要GNU awk作为它的时间函数。它是在终端上测试的,所以它几乎是一条龙命令。
awk 'BEGIN { FS=OFS="," } { $7=strftime("%Y%m%d",mktime("20"substr($7,2,2)" 01 01 00 00 00")+(substr($7,4)*86400)-3600) } 1' filename.txt解释:
时间戳)是一个内置函数,根据format.
YYYY MM DD HH MM SS.day。因为这些函数以秒作为输入,所以转换到秒是required.999.发布于 2022-02-23 17:02:47
仅仅消除对cut的所有调用就会产生奇妙的效果;您可能不需要awk。
count=0
while IFS=, read -r c1 c2 c3 c4 c5 c6 c7 col_8 rest; do
col_7=${c7:3:3}
year1=${c7:1:2}
col_1=$c1$c2$c3$c4$c5$c6
col_8=$c8
date7=$(date -d "01/01/$year1 +$col_7 days - 1 day" +%Y%m%d)
...
count=$((count+1))
done < "$t1"https://stackoverflow.com/questions/71241036
复制相似问题