Linux / Shell нарезка большого текстового файла - PullRequest
1 голос
/ 22 июня 2019

С учетом

File1

uniquename1:somethinguseless:somethinguseless:uniquekey1
uniquename2:somethinguseless:somethinguseless:uniquekey2
uniquename3:somethinguseless:somethinguseless:uniquekey3

File2

uniquekey1:hello
uniquekey2:apple
uniquekey3:hello

Я хочу сделать метод, который в основном делает это

$ command uniquename2
apple
$ command uniquename1
hello
$ command uniquename3
hello

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

МОЯ ПОПЫТКА

$ grep -i 'uniquename1' | (not sure how to slice the line with regex "*:*:*") | grep $thisline file2

Ответы [ 4 ]

1 голос
/ 22 июня 2019

Правильный ответ:

$ awk -v tgt='uniquename2' -F':' 'NR==FNR{map[$1]=$2; next} $1==tgt{print map[$NF]}' file2 file1
apple

или почти (см. Мой комментарий под ним) что @DudiBoy разместил .

1 голос
/ 22 июня 2019

Здесь скрипт awk, который сканирует оба файла только один раз.В отличие от вложенного grep решения, выполняющего uniqueId * (uniqueId - 1) файл сканирования.

script.awk

BEGIN {FS=":"} # field separator is :
FNR == NR && $1 == keyArg {id = $NF} # find the id in first file
FNR == NR {next} # continue scanning first file
$1 == id {print $2} # find the id in second file and print its 2nd field value

Выполнение:

 awk -v keyArg="uniquename2" -f script.awk file1 file2 
1 голос
/ 22 июня 2019

sed делает это относительно легко. Например:

$ sed -n "/$(sed -n '/uniquename2/s/.*[:]//p' file1)/s/.*[:]//p" file2
apple

или

$ sed -n "/$(sed -n '/uniquename3/s/.*[:]//p' f1)/s/.*[:]//p" f2
hello

Вы просто используете подстановку команды $(sed -n '/uniquename3/s/.*[:]//p' f1), чтобы получить uniquekey из uniquename, обрезая ведущую часть строки, и затем делаете то же самое с результатом, чтобы получить искомый результат. строка с sed -n "/$(command)/s/.*[:]//p" с использованием двойных кавычек на внешней стороне, чтобы позволить подстановке команды развернуться.

Форма используемой базовой команды sed представляет собой нормальную подстановку s/find/replace с полным совпадением шаблонов для общего числа

sed '/match/s/find/replace/`

-n подавляет обычную печать пространства шаблона, а p в конце заставляет его печатать при успешном совпадении и замене.

Если uniquename или uniquekey Содержат символы регулярного выражения

С учетом вашего комментария о том, что ваш фактический файл возвращает ошибку, каждый uniquename или uniquekey в ваших реальных файлах содержит символы, которые можно интерпретировать как регулярные выражения. В этом случае должно работать решение GNU awk, использующее переменную FILENAME для извлечения необходимой информации из каждого файла на основе полей, разделенных ':', например.

$ awk -F: -v name=uniquename2 '
    FILENAME == "file1" { $1 == name && key = $NF } 
    FILENAME == "file2" { if ($1 == key) print $NF }
' file1 file2
apple

Дайте мне знать, если у вас есть проблемы там. Кроме того, если вы можете опубликовать несколько реальных примеров (скажем, по 10 строк) ваших file1 и file2, это поможет.

0 голосов
/ 22 июня 2019

Утилита cut была разработана для данных этого типа:

#!/bin/bash
KEY=$(grep -i -e "^$1:" file1.txt | cut -d ':' -f 4)
grep -e "^$KEY" file2.txt | cut -d ':' -f 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...