【发布时间】:2021-01-15 07:43:29
【问题描述】:
我有一个结构如下的文件
#data 28-Sep-2020 16:48:04
#Version 1.1
#start
27-Sep-2020 16:00:22.00 83004 83.004784 uA 1
27-Sep-2020 16:01:22.00 82821 82.821602 uA 1
27-Sep-2020 16:02:22.00 82786 82.786552 uA 1
27-Sep-2020 16:03:22.00 82666 82.666336 uA 1
27-Sep-2020 16:04:22.00 82837 82.837242 uA 1
27-Sep-2020 16:05:22.00 82579 82.579857 uA 1
27-Sep-2020 16:06:22.00 82693 82.693413 uA 1
27-Sep-2020 16:08:22.00 82700 82.700043 uA 1
27-Sep-2020 16:09:22.00 82646 82.646797 uA 1
27-Sep-2020 16:10:22.00 82794 82.794540 uA 1
27-Sep-2020 16:11:22.00 82600 82.600845 uA 1
27-Sep-2020 16:12:22.00 82815 82.815422 uA 1
27-Sep-2020 16:13:22.00 82866 82.866974 uA 1
我正在尝试在文件中附加 %Y %-m %-d 日期格式的第一列,%-H %-M 日期格式的第二列,最后是第四列:
2020 9 27 16 0 83.004784
2020 9 27 16 1 82.821602
2020 9 27 16 2 82.786552
2020 9 27 16 3 82.666336
2020 9 27 16 4 82.837242
2020 9 27 16 5 82.579857
2020 9 27 16 6 82.693413
2020 9 27 16 7 82.700043
2020 9 27 16 8 82.646797
2020 9 27 16 9 82.794540
2020 9 27 16 10 83.004784
2020 9 27 16 11 82.600845
2020 9 27 16 12 82.815422
2020 9 27 16 13 82.866974
我想过使用getline 和date 命令,所以这就是我在单行中所做的(为了清楚起见,我只是在此处拆分命令)作为第一列
$awk '{if(NR>=4)parsedate="date --date="$1" +\"%Y %-m %-d\""
cmd | getline mydate
close(parsedate);
if(NR>=4 && NR<=10) print mydate, $4}' inputfile
这运行良好且快速。当我尝试使用以下单行对第二列执行相同操作时
$awk '{if(NR>=4)parsedate="date --date="$2" +\"%-H %-M\""
cmd | getline mydate close(parsedate);
if(NR>=4 && NR<=10) print mydate, $4}' inputfile
它明显变慢(输入文件是一个大文件,所以我认为它忽略了if 语句),虽然它打印出它应该打印的内容(即第 4 行的16 0 83.004784)它返回以下错误
awk: cmd. line:1: (FILENAME=inputfile FNR=1023) fatal: cannot open pipe `date --date=08:59:22.00 +"%-H %-M"' (Too many open files)
对我来说奇怪的是,我确实在使用 close() 命令,所以我不知道它为什么会抱怨,而且只是在小时的情况下。
欢迎提出任何想法!
【问题讨论】: