我有一个文件目录,其文件名为file000.txt
到filennn.txt
。我希望能够指定一系列文件名,并根据匹配打印这些文件的内容。我用一个文件模式实现了它:
$ gawk 'FILENAME ~/file038.txt/ {print FILENAME, $0}' file*.txt
file038.txt Some 038 text here
但我无法获得允许我指定一系列文件名的模式,例如
gawk 'FILENAME ~/file[038-040].txt/ {print FILENAME, $0}' file*.txt
我确定我在这里错过了一些简单的东西,我是AWK的新手。有什么建议吗?
答案 0 :(得分:1)
你可以对文件名进行一些替换,例如:
awk '{x=FILENAME;gsub(/[^0-9]/,"",x);x+=0}x>10&&x<50{your logic}' file*.txt
以这种方式,文件file011.txt ~ file049.txt
将使用&#34;您的逻辑&#34;
你可以调整部分:x>10&&x<50
例如,只处理名称中的数字为奇数/偶数的文件....只需在那里写布尔表达式。
答案 1 :(得分:0)
gawk
和最新版bash
有一个bash
原语来处理file[038-040].txt
。它使代码非常简单:
gawk 'FNR==1 {print FILENAME, $0} {quit}' file{038..040}.txt
关键点:
FNR==1 {print FILENAME, $0}
这将打印文件名和每个文件的第一行
{quit}
这可以通过直接跳到下一个文件来节省时间。
file{038..040}.txt
构造{038..040}
是一个名为大括号扩展的bash功能。 bash
将使用您想要的文件名替换它。如果您想测试大括号扩展以了解它是如何工作的,请使用以下简单语句在命令行上尝试:
echo file{038..040}.txt
更新1:Mac OSX目前使用bash v3.2,它不支持大括号扩展中的前导零。
更新2:如果文件丢失并且你有一个现代gawk
(v4.0或更高版本),请改用它:
gawk 'BEGINFILE{ if (ERRNO) nextfile} FNR==1 {print FILENAME, $0} {quit}' file{038..040}.txt
gawk
和普通POSIX shell gawk '{n=0+substr(FILENAME,5,3)} FNR==1 && n>=38 && n<=40 {print FILENAME, $0} {quit}' file*.txt
说明:
n=0+substr(FILENAME,5,3)
从文件名中提取数字。 0+
是一种强制awk
将n
视为数字的技巧。
n>=38 && n<=40 {print FILENAME, $0}
这将根据文件编号选择文件,并打印文件名和第一行。
{quit}
与以前一样,这可以通过阻止awk
阅读每个文件的其余部分来节省时间。
file*.txt
任何POSIX shell都可以将其扩展到文件名列表。
答案 2 :(得分:0)
奇怪的方式,但在这些方面的东西:
awk '{ if (match(FILENAME,/file0[3-4][0-8].txt/)) { print FILENAME, $0}}' file*.txt
答案 3 :(得分:0)
应该工作
awk '(x=FILENAME)~/(3[8-9]|40).txt$/{print x,$0;quit}' file*.txt
由于戒烟不起作用(至少我的awk版本),这是另一种方式
awk 'FNR==((x=FILENAME)~/(3[8-9]|40).txt$/){print x,$0}' file*.txt