基于FILENAME模式的AWK打印

时间:2014-10-14 07:47:20

标签: regex awk gawk

我有一个文件目录,其文件名为file000.txtfilennn.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的新手。有什么建议吗?

4 个答案:

答案 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+是一种强制awkn视为数字的技巧。

  • 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