【问题标题】:Using awk to include file name with format in column使用 awk 在列中包含具有格式的文件名
【发布时间】:2019-02-27 04:48:49
【问题描述】:

我正在处理一些数据以摄取到 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

但是,作为一个初学者,我不知道如何将这个命令扩充为:

  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 的新手。

【问题讨论】:

  • 简单地使用 HQL 函数怎么样?参看。 stackoverflow.com/a/16719530/5162372
  • 感谢您的创造性思维。我可能会走这条路,因为我所有的文件都被压缩了,实现 awk 所需的解压缩/重新压缩时间没有意义。

标签: linux unix awk hive


【解决方案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

【讨论】:

    【解决方案2】:

    您可以使用设置“文件”的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
    

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2022-12-05
      • 1970-01-01
      • 2020-07-11
      • 2016-11-24
      • 2015-01-05
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多