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

mlnl4t2r  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(379)

我正在研究如何把数据输入Hive。问题是,我已经覆盖了我的历史数据,所以我需要在文本文件中包含文件名,这样我就可以处理在后续文件中更新的重复行。
我选择的方法是 awk 若要将文件名添加到每个文件中,则在我将其摄取到配置单元中之后,我可以使用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

但是,作为一个初学者,我不知道如何将这个命令扩展到:
使列名(第一行)类似于“文件名”
在awk中实现regex,只提取文件名中我需要的部分,并处理其余部分。我真的只想 "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 .

dwthyt8l

dwthyt8l1#

这将处理一个或多个输入文件:

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

lg40wkob2#

你可以用 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

相关问题