簡體   English   中英

基於FILENAME模式的AWK打印

[英]AWK print based on FILENAME pattern

我有一個文件目錄,文件名的格式為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新手。 有什么建議么?

您可以對文件名進行一些替換,例如:

awk '{x=FILENAME;gsub(/[^0-9]/,"",x);x+=0}x>10&&x<50{your logic}' file*.txt

這樣,文件file011.txt ~ file049.txt將使用“您的邏輯”進行處理

您可以調整部分:例如, x>10&&x<50 ,僅處理名稱中的數字為奇數/偶數/ ....的文件,只需在其中寫入布爾表達式即可。

使用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

使用帶有普通POSIX外殼的gawk解決方案

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都可以將其擴展為文件名列表。

奇怪的方式,但這些行上的內容:

awk '{ if (match(FILENAME,/file0[3-4][0-8].txt/)) { print FILENAME, $0}}' file*.txt

應該管用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM