簡體   English   中英

使用 awk function 從 hdfs 目錄中提取特定部分

[英]extract specific parts from hdfs directory using awk function

我正在嘗試從/rec/flux_entrant/archive/le501/tble91_formation_eligible/*目錄中提取特定部分。 該目錄位於HDFS以便我們可以使用以下命令公開其包含: hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/*返回

/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220104-221755/00000.deflate
/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220103-231754/00001.deflate
/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220111-152145/00002.deflate
/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220112-155012/00003.deflate

我的目標是僅提取由(不是xxx.deflate文件)給出的這些路徑的最后一部分: 20220104-22175520220103-23175420220111-15214520220112-155012 ,然后過濾那些具有 date => 20220110的路徑,這樣,最終結果應該是: 20220111-15214520220112-155012因為2022011120220112 => 到20220110

我嘗試使用以下命令使用awk命令:

hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/* | awk -F'/' '{split($NF, a, "-"); if (a[1]>20220110) print $NF}'

但是這個返回: 00003.deflate00002.deflate而不是20220111-15214520220112-155012

編輯

正如@Tom 建議的那樣,我使用print $(NF-1)而不是$NF ,但過濾器不好。 我還嘗試在列表變量中獲取結果:

OUTPUT=$(hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/* |
awk -F'/' '{split($NF, a, "-"); if (a[1]>=20220110) print $(NF-1)}')
echo ${OUTPUT}

Found 5 items 20200916-170926 20200916-170926 20200916-170926 20200916-170926 20200916-170926 Found 5 items 20200916-182251

不好,因為2020091620200916 ... 不是 => 20220110我還需要從最終結果中刪除Found 5 items

請問有什么幫助嗎? 謝謝你

試試這個,使用 AWK 的變量FPAT

hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/* | 
 awk -v startdate="20220110" 'BEGIN{FPAT="[0-9]{8}-[0-9]{6}"}($1 >= startdate){print $1}'

我使用變量startdate來避免將字符串20220110硬編碼到 AWK 代碼中。

說明: FPAT描述了 AWK 必須考慮的字段:在我們的例子中,是一個 8 位數字的序列,后跟一個連字符,然后是 6 個數字。 AWK 打印它在輸入print $1中找到的唯一序列,條件是($1 >= startdate)

據我了解,你實際上想要這樣的事情開始:

$ hdfs dfs ls -d /path/to/dir/*/

這將 select /path/to/dir下的所有子目錄,並且由於標志-d而不會遍歷它們(參見hadoop 文檔。從那時起,選擇目錄很簡單。目錄的形式為YYYYMMDD-hhmmss和因此按字典順序排序。所以你可以做這樣的事情:

$ hdfs dfs ls -d /path/to/dir/*/ | awk -F/ '($NF<"20220128"){print $NF}'

請注意,我們在$NF<"20220128"中進行字符串比較而不是數值比較。 由於 awk 的內部結構,您可以進行數字比較,並且 awk 將在其轉換中去除字符串的所有非數字部分。 所以你可以這樣做:

$ hdfs dfs ls -d /path/to/dir/*/ | awk -F/ '($NF+0<20220128){print $NF}'

暫無
暫無

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

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