awk – 显示文件名

我试图做一个命令,添加到我的文件:当前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 

讨论printfman 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