AWK 命令在 AIX 上未按预期工作
AWK command is not working as expected on AIX
我写了下面的脚本来根据公共列名合并 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[] = ; next} {for(i=1;i<=NF;i++) s=$s$(i)","}{print $s"," a[]}' \
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[]}
似乎有问题。您使用美元符号 ($) 来引用 awk 程序中的字段,后跟您想要的字段编号。因此,</code> 指第一个字段,<code>
指第二个字段,依此类推。
它实际上是内部生产的
{print [=10=] "," a[]}
因为您的变量 s
是非数字的,所以计算结果为零 (0
)
如果你仔细观察你的代码
awk -F"," 'NR==FNR {a[] = ; next} {for(i=1;i<=NF;i++) s=$s$(i)","}{print $s"," a[]}'
file2.csv
file1.csv > tablespace_growth_date +"%d-%m-%Y"
.csv
for循环结束后(你只是在每次迭代中覆盖相同的s=$s$(i)","
)
Actual value of s=TABLESPACE_name,PCT_FREE_01-02-21,PCT_FREE_02-02-21PCT_FREE_02-02-21,
将评估为零 (0
) 因此打印当前记录后跟数组值。
进一步演示:
$ cat testfile.txt
1 2
3 4
5 6
7 8
$ awk '{ string_val="non-numeric"; printf("$(%d) => %s\n", string_val,$(string_val))}' testfile.txt
$(0) => 1 2
$(0) => 3 4
$(0) => 5 6
$(0) => 7 8
$ awk '{ string_val="2"; printf("$(%d) => %s\n", string_val,$(string_val))}' testfile.txt
$(2) => 2
$(2) => 4
$(2) => 6
$(2) => 8
以下可能对您有帮助:
awk 'BEGIN{FS=OFS=","}FNR==NR{arr[]=;next} in arr{print [=13=],arr[]}' file2.csv file1.csv
甚至
awk 'BEGIN{
FS=OFS=","
}
FNR==NR{
arr[]=;
next
}
{
printf("%s%s%s",[=14=],(( in arr)?OFS arr[]:""),RS)
}' file2.csv file1.csv
输出:
$ awk 'BEGIN{FS=OFS=","}FNR==NR{arr[]=;next} in arr{print [=15=],arr[]}' file2.csv file1.csv
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
输入:
$ 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
$ 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
我写了下面的脚本来根据公共列名合并 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[] = ; next} {for(i=1;i<=NF;i++) s=$s$(i)","}{print $s"," a[]}' \
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[]}
似乎有问题。您使用美元符号 ($) 来引用 awk 程序中的字段,后跟您想要的字段编号。因此,</code> 指第一个字段,<code>
指第二个字段,依此类推。
它实际上是内部生产的
{print [=10=] "," a[]}
因为您的变量 s
是非数字的,所以计算结果为零 (0
)
如果你仔细观察你的代码
awk -F"," 'NR==FNR {a[] = ; next} {for(i=1;i<=NF;i++) s=$s$(i)","}{print $s"," a[]}'
file2.csv
file1.csv > tablespace_growth_date +"%d-%m-%Y"
.csv
for循环结束后(你只是在每次迭代中覆盖相同的s=$s$(i)","
)
Actual value of s=TABLESPACE_name,PCT_FREE_01-02-21,PCT_FREE_02-02-21PCT_FREE_02-02-21,
将评估为零 (0
) 因此打印当前记录后跟数组值。
进一步演示:
$ cat testfile.txt
1 2
3 4
5 6
7 8
$ awk '{ string_val="non-numeric"; printf("$(%d) => %s\n", string_val,$(string_val))}' testfile.txt
$(0) => 1 2
$(0) => 3 4
$(0) => 5 6
$(0) => 7 8
$ awk '{ string_val="2"; printf("$(%d) => %s\n", string_val,$(string_val))}' testfile.txt
$(2) => 2
$(2) => 4
$(2) => 6
$(2) => 8
以下可能对您有帮助:
awk 'BEGIN{FS=OFS=","}FNR==NR{arr[]=;next} in arr{print [=13=],arr[]}' file2.csv file1.csv
甚至
awk 'BEGIN{
FS=OFS=","
}
FNR==NR{
arr[]=;
next
}
{
printf("%s%s%s",[=14=],(( in arr)?OFS arr[]:""),RS)
}' file2.csv file1.csv
输出:
$ awk 'BEGIN{FS=OFS=","}FNR==NR{arr[]=;next} in arr{print [=15=],arr[]}' file2.csv file1.csv
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
输入:
$ 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
$ 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