Bash обработка текста - PullRequest
       8

Bash обработка текста

0 голосов
/ 19 октября 2018

У меня есть три файла: file1, file2 и exlfile1, и file2 имеют два столбца содержимого.Первый столбец одинаков в обоих файлах.

Я хочу объединить содержимое обоих файлов, используя этот столбец.Это легко с помощью команды join.Но есть проблема с файлом exl: он содержит несколько слов, которые я хочу, чтобы команда join игнорировала / удаляла.

Есть ли способ сделать это с помощью join или я должен использовать вместо него awk?

file1:

A la  
B lb  
C lc  
D something  

file2:

A ba  
B bb  
C another  
D bd  

exl:

something  
nothing  

Ожидаемый результат:

A la ba  
B lb bb  
C lc  
D bd  

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

После объединения вы можете использовать sed, чтобы удалить слова в exl.Хитрость заключается в том, чтобы сначала поместить все исключенные слова в одну строку с разделителями каналов, что может помочь с помощью awk.

EXCLUDE=`awk '{if(NR>1){printf("\\\|")}; printf(" %s", $1)}' exl`
join -1 1 file1 file2 | sed "s/$EXCLUDE//"

Сначала поместите все исключенные слова в одну строку с помощью awk и назначьте выводИСКЛЮЧИТЬ (разделитель с пробелом-разделителем, который требуется для sed)Затем просто объедините и замените все слова EXCLUDE ни на что (т.е. удалите все слова в EXCLUDE).

Можно также пропустить временную переменную и сделать это в одной строке:

join -1 1 file1 file2 | sed "s/`awk '{if(NR>1){printf("\\\|")}; printf(" %s", $1)}' exl`//"
0 голосов
/ 19 октября 2018
gjoin -t $'\t' <(gjoin -t $'\t' -v 1 file1 exl) <(gjoin -t $'\t' -v 1 file2 exl)

(Для моей настройки Mac OS X с установленными инструментами GNU и со значениями, разделенными табуляцией; измените для вашего случая.)

Конструкция <(...) устанавливает вывод команды каквиртуальный файл, который внешняя командная строка может принять в качестве параметра.

Параметр -v 1 для join означает: «распечатать все строки первого файла, которые не могут быть объединены».

Таким образом, gjoin -t $'\t' -v 1 file1 exl будет пытаться объединить первый файл со списком исключений и печатать только те, которые отсутствуют в списке исключений.Аналогично для file2.

Затем мы берем вывод этих двух отрицательных объединений в реальное объединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...