簡體   English   中英

使用awk在列中包含格式的文件名

[英]Using awk to include file name with format in column

我正在努力整理一些數據以提取到Hive中。 問題是,我的歷史數據已被覆蓋,因此我需要在文本文件中包含文件名,以便可以處理在后續文件中已更新的重復行。

我選擇執行此操作的方法是使用awk將文件名添加到每個文件中,然后在提取到Hive之后,可以使用HQL過濾掉不贊成使用的行。

這是我的示例數據(制表符分隔):

animal  legs    eyes
hippo   4       2
spider  8       8
crab    8       2
mite    6       0
bird    2       2

我已將其命名為long_name_20180901.txt

我已經想出了如何從這篇文章中添加新列:

awk '{print FILENAME (NF?"\t":"") $0}' long_name_20180901.txt

結果是:

long_name_20180901.txt  animal  legs    eyes
long_name_20180901.txt  hippo   4       2
long_name_20180901.txt  spider  8       8
long_name_20180901.txt  crab    8       2
long_name_20180901.txt  mite    6       0
long_name_20180901.txt  bird    2       2

但是,作為一個初學者,我不知道如何將該命令擴展為:

  1. 使列名(第一行)類似“ file_name”
  2. 在awk中實現正則表達式以僅提取我需要的文件名的一部分,然后處理其余部分。 我真的只想要"long_name_(.{8,}).txt" (捕獲組中的內容)。

目標輸出是:

file  animal  legs    eyes
20180901  spider  8       8
20180901  crab    8       2
20180901  mite    6       0
20180901  bird    2       2

謝謝你的時間!! 我是awk新手。

您可以使用BEGIN設置“文件”,然后將其重置為其余部分使用文件名。

awk 'BEGIN{f="file\t"} NF{print f $0; if (f=="file\t") {l=split(FILENAME, a, /[_.]/); f=a[l-1]"\t"};}' long_name_20180901.txt

這將處理一個或多個輸入文件:

awk -v OFS='\t' '
    NR==1 { print "file", $0 }
    FNR==1 { n=split(FILENAME,t,/[_.]/); fname=t[n-1]; next }
    { print fname, $0 }
' *.txt

暫無
暫無

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

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