Объединение> 2 файлов с AWK или JOIN? - PullRequest
0 голосов
/ 20 января 2019

Объединение 2 файлов с использованием AWK - тема, хорошо освещенная в StackOverflow.Однако техника чтения 3 файлов в массив становится более сложной.Поскольку я форматирую вывод, чтобы перейти в скрипт R, мне нужно будет добавить много синтаксиса, чтобы я не думал , что я могу использовать JOIN.Вот упрощенная версия, которую я до сих пор работаю:

awk 'FNR==1{f++}
     f==1{a[FNR]=$1;next}
     f==2{b[FNR]=$1;next}
     {print a[FNR], "<- c(", b[FNR], ",", $1, ")"}' words.txt x.txt y.txt 

Где:

$ cat words.txt
word1
word2
word3

$ cat x.txt
1
2
3

$ cat y.txt
11
22
33

Выходные данные тогда

word1 <- c(1, 11)
word2 <- c(2, 22)
word3 <- c(3, 22)

Лучший способ, которым я могу подвести итогэтот метод

  1. Создайте переменную f, чтобы отслеживать, какой файл вы обрабатываете
  2. Для файла 1 считайте значения в массив a
  3. Для файла 2прочитайте значения в массив b
  4. Перейдите к третьему файлу, где вы объедините свой окончательный результат

Как новичок в AWK, это работает, но я нахожу это немного неловким иЯ волнуюсь, возвращаясь к коду через 6 месяцев, я больше не пойму его.Это лучший способ объединить эти 3 файла в AWK?Может ли JOIN на самом деле обрабатывать этот уровень форматирования конечного результата?

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Если это для удобочитаемости, вы можете изменить метод проверки файлов, а также имена переменных.
Попробуйте, пожалуйста:

awk 'ARGIND==1{words[FNR]=$1;}
     ARGIND==2{xcol[FNR]=$1;}
     ARGIND==3{print words[FNR], "<- c(", xcol[FNR], ",", $1, ")"}' words.txt x.txt y.txt

Выше метод проверки файлов предназначен для GNU awk.

Изменение на другое, а также изменение порядка чтения файлов будут следующими:

awk 'FILENAME=="words.txt"{print $1, "<- c(", xcol[FNR], ",", ycol[FNR], ")";}
     FILENAME=="x.txt"{xcol[FNR]=$1;}
     FILENAME=="y.txt"{ycol[FNR]=$1;}' x.txt y.txt words.txt 

Как вы также можете видеть здесь, порядок чтения файлов и порядок блоков могут различаться.
Поскольку words.txt имеет первый столбец, или, так сказать, main column, разумно читать его последним.

Вы также можете использовать FILENAME==ARGV[1] FILENAME==ARGV[2] и т. Д. Для проверки файлов и размещения комментариев внутри (используйте awk файл сценария и лучше загружайте с awk -f scriptfile с комментариями):

awk 'FILENAME==ARGV[1]{xcol[FNR]=$1;} #Read column B, x column
     FILENAME==ARGV[2]{ycol[FNR]=$1;} # Read column C, y cloumn
     FILENAME==ARGV[3]{print $1, "<- c(", xcol[FNR], ",", ycol[FNR], ")";}' x.txt y.txt words.txt 
0 голосов
/ 20 января 2019

вариант решения @ RavinderSingh13

$ paste {words,x,y}.txt | awk '{print $1, "<- c(" $2 ", " $3 ")"}'
0 голосов
/ 20 января 2019

РЕДАКТИРОВАТЬ: Не могли бы вы попробовать следующее.

paste words.txt x.txt y.txt | awk '{$2="<- c("$2", "$3")";$3="";sub(/ +$/,"")} 1'

Вывод будет следующим.

word1 <- c(1, 11)
word2 <- c(2, 22)
word3 <- c(3, 33)


В случае, если вы просто хотите добавить содержимое 3 файлов в тиски столбца, попробуйте выполнить следующее.

paste words.txt x.txt y.txt 
word1   1   11
word2   2   22
word3   3   33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...