Использование awk для включения имени файла с форматом в столбец - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю над тем, чтобы обработать некоторые данные для загрузки в 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.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Это будет обрабатывать один или несколько входных файлов:

awk -v OFS='\t' '
    NR==1 { print "file", $0 }
    FNR==1 { n=split(FILENAME,t,/[_.]/); fname=t[n-1]; next }
    { print fname, $0 }
' *.txt
0 голосов
/ 26 февраля 2019

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...