【发布时间】:2021-05-06 14:07:58
【问题描述】:
我已经编写了下面的脚本来根据公共列名合并 2 个文件,它在 linux 机器上按预期运行,但是当我在 AIX 上执行相同的文件时,它会抛出错误
输入文件:
[user@XXXXX ~]$ cat file1.csv
TABLESPACE_name,PCT_FREE_01-02-21,PCT_FREE_02-02-21
SYSCATSPACE,50,50
TESTDTAI,50,50
USERSPACE1,98,98
TEMP32K,0,0
TEMP4K,0,0
TESTDTAL,49,49
TESTDTAT4K,50,50
TESTDTAT32K,0,0
TESTCTLI,8,8
TESTCTLL,0,0
TESTCTLT4K,2,2
TESTCTLT32K,25,25
SYSTOOLSPACE,94,94
SYSTOOLSTMPSPACE,0,0
[user@XXXXX ~]$ cat file2.csv
TABLESPACE_name,PCT_FREE_03-02-21
SYSCATSPACE,50
TESTDTAI,50
USERSPACE1,98
TEMP32K,0
TEMP4K,0
TESTDTAL,49
TESTDTAT4K,50
TESTDTAT32K,0
TESTCTLI,8
TESTCTLL,0
TESTCTLT4K,2
TESTCTLT32K,25
SYSTOOLSPACE,94
SYSTOOLSTMPSPACE,0`
命令:
awk -F"," 'NR==FNR {a[$1] = $2; next} {for(i=1;i<=NF;i++) s=$s$(i)","}{print $s"," a[$1]}' \
file2.csv \
file1.csv > tablespace_growth_`date +"%d-%m-%Y"`.csv
Linux 机器上的输出:
TABLESPACE_name,PCT_FREE_01-02-21,PCT_FREE_02-02-21,PCT_FREE_03-02-21
SYSCATSPACE,50,50,50
TESTDTAI,50,50,50
USERSPACE1,98,98,98
TEMP32K,0,0,0
TEMP4K,0,0,0
TESTDTAL,49,49,49
TESTDTAT4K,50,50,50
TESTDTAT32K,0,0,0
TESTCTLI,8,8,8
TESTCTLL,0,0,0
TESTCTLT4K,2,2,2
TESTCTLT32K,25,25,25
SYSTOOLSPACE,94,94,94
SYSTOOLSTMPSPACE,0,0,0
AIX 上的输出:
awk: 0602-562 Field $() is not correct.
The input line number is 1. The file is file1.csv.
The source line number is 1.
请帮助解决这个问题。
【问题讨论】:
-
{print $s"," a[$1]}似乎有问题。您使用美元符号 ($) 来引用 awk 程序中的字段,后跟所需字段的编号。因此,$1指第一个字段,$2指第二个字段,依此类推。 -
使用
s代替$s——不同的awk 版本在语法错误方面并不完全兼容:一些变体比其他变体更宽容。 -
在 Linux 上,您可能正在运行 gawk,因此请添加
--lint标志 (awk --lint -F...) 并阅读它给您的警告,特别是:awk: cmd. line:1: (FILENAME=file1.csv FNR=16) warning: attempt to field reference from non-numeric value SYSTOOLSTMPSPACE,0,0,0等。