Как насчет этого -
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.Как только это условие становится ложным, это означает, что второй файл запущен и начинает выполняться следующий оператор действия шаблона.