Совпадение строк на основе первого поля и объединение второго поля - PullRequest
0 голосов
/ 27 ноября 2011

Я хотел бы объединить записи из второго поля из двух файлов, используя awk, sed или аналогичные.

File0:

string:data:moredata

File1:

string:random:moredata

Если в первом поле строка в file0 есть соответствующая запись в file1 , выведите

$random:$data

Выбор полей кажется тривиальным:

$ awk -F':' '{print $2}' filename

Необходимо сопоставить строки и напечатать соответствующий столбец $ 2

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

Как насчет этого -

awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2

Выполнение:

[jaypal~/Temp]$ cat file1
string:data:moredata

[jaypal~/Temp]$ cat file2
string:random:moredata

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:data

В этом решении мы загружаем всю запись файла file1 в массивиндексируется в столбце 1. Мы делаем быструю проверку в следующем файле, чтобы увидеть, присутствует ли столбец 1.Если это так, то оператор print выполняется.

Отрицательный тест:

[jaypal~/Temp]$ cat file1
string:data:moredata
man:woman:child

[jaypal~/Temp]$ cat file2
man:random:moredata
string:woman:child

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:woman
woman:data

Просто чтобы добавить к объяснению, NR и FNR - встроенные переменные awk.NR дает номер строки и не сбрасывается в 0 при зацикливании на два файла.FNR, напротив, также является номером строки, который сбрасывается в 0 при запуске второго файла.Таким образом, это позволяет нам сохранить файл 1 в массиве, потому что это действие выполняется только тогда, когда NR == FNR.Как только это условие становится ложным, это означает, что второй файл запущен и начинает выполняться следующий оператор действия шаблона.

1 голос
/ 28 ноября 2011

Это решение sed может работать для вас:

# cat file1
string0:data1:moredata
string2:data3:moredata
string4:data5:moredata
string6:data7:moredata
string8:data9:moredata
# cat file2
string0:random1:moredata
string2:random3:moredata
string4:random5:moredata
cat file1 - <<<"EOF" file2 | 
sed '1,/^EOF/{H;d};G;s/^\([^:]*:\)\([^:]*:\).*\1\([^:]*\).*/$\2$\3/p;d'
$random1:$data1
$random3:$data3
$random5:$data5

Объяснение:

Объединить файлы с разделителем EOF.Хлопните первый файл в пространство для хранения (HS).Добавьте HS ко всем строкам во втором файле, создав таблицу соответствия.Используйте группировку и обратные ссылки для замены требуемого результата вывода.Кстати, были ли $ в $random:$data предназначены?

Это решение также можно сделать более эффективным, сохранив только необходимые данные в поиске и каждой строке файла2.

0 голосов
/ 27 ноября 2011

join - join lines of two files on a common field

Так что делайте свою вещь на awk, печатайте только данные и поле "ключ".Затем выполните команду соединения, подобную: join -1 1 -2 1 file1 file2 > joined.dat

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