我正在整理一些数据以提取到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
我想出了如何从this post添加新列:
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
但是,作为一个初学者,我不知道如何将该命令扩展为:
"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
的新手。
答案 0 :(得分:1)
您可以使用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
答案 1 :(得分:1)
这将处理一个或多个输入文件:
awk -v OFS='\t' '
NR==1 { print "file", $0 }
FNR==1 { n=split(FILENAME,t,/[_.]/); fname=t[n-1]; next }
{ print fname, $0 }
' *.txt