我试图做一个命令,添加到我的文件:当前input文件的名称+行的索引,其中逗号的数目less于5 +在整个行的逗号数。
我有:
awk -F"," '{ if(NF > 5) printf("Filename: %d Index: %d Number of commas : %d\n",FILENAME,NR, NF-1); }' dsc* >> filename.csv
输出是:
Filename: 0 Index: 68520 Number of commas : 6
索引和逗号似乎工作正常,但是文件名呢? 我究竟做错了什么?
它应该是例如:
Filename: dscabc.txt Index: 68520 Number of commas : 6 Filename: dscabc1.txt Index: 123 Number of commas : 6
FILENAME
是一个字符串,而不是一个数字。 使用%s
:
awk -F"," '{ if(NF > 5) printf("Filename: %s Index: %d Number of commas : %d\n",FILENAME,NR, NF-1); }' dsc* >> filename.csv
讨论printf
的man awk
部分:
%d, %i A decimal number (the integer part). %s A character string.
对于字符串,在printf
使用%s
格式:
awk -F"," '{ if(NF > 5) printf("Filename: %s Index: %d Number of commas : %d\n",FILENAME,NR, NF-1); }' dsc* >> filename.csv
FILENAME是awk中的一个内置变量,它总是设置为正在读取的当前文件的名称。 变量的类型是字符串(由c中的null终止的字符数组表示)。
awk -F"," '{ if(NF > 5) printf("Filename: %d Index: %d Number of commas : %d\n",FILENAME,NR, NF-1); }' dsc* >> filename.csv
在这个命令中你已经给出'%d'作为'FILENAME'的格式说明符,它提示awk把'FILENAME'解释为一个整数。 你可以修改你的命令来使用%s
而不是把它解释为字符串。 修改后的命令应该如下所示:
awk -F"," '{ if(NF > 5) printf("Filename: %s Index: %d Number of commas : %d\n",FILENAME,NR, NF-1); }' dsc* >> filename.csv