[英]AWK print based on FILENAME pattern
我有一個文件目錄,文件名的格式為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新手。 有什么建議么?
您可以對文件名進行一些替換,例如:
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
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+
是強制awk
將n
視為數字的技巧。
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.