Вот один способ:
$ awk -F"[, ]" 'NR==FNR{a[$1]=$1","$2; next} ($2 in a){print a[$2]","$1}' file1 file2
1000,Brian,3044
400,Nick,4466
1010,Jason,1206
-F "[,]"
устанавливает разделитель полей на пробел или запятую. FNR
- номер текущей строки, а NR
- номер текущей строки текущего файла. Эти два будут равны только при чтении 1-го файла. Следовательно, NR == FNR {a [$ 1] = $ 1 "," $ 2; next}
будет выполняться только в строках первого файла и сохранит 1-е и 2-е поля (с запятой между ними) как значения в массиве a
, ключи которого являются 1-м полями. Затем, когда 2-й файл читается, если 2-е поле находится в a
, мы печатаем связанное с ним значение (1-е и 2-е поля первого файла) и 1-е поле второго файла. .
Тем не менее, для этого есть приложение! Именно для этого и было создано join
.К сожалению, поскольку ваши два файла не отсортированы и имеют разные разделители, нам понадобятся некоторые хитрости. Если ваша оболочка поддерживает <()
, вы можете сделать:
$ join -t, -1 1 -2 2 <(sort file1) <(sed 's/ /,/g' file2 | sort -t"," -k2)
1000,Brian,3044
1010,Jason,1206
400,Nick,4466
join -t, -1 1 -2 2
означает использование ,
в качестве разделителя и присоединитесь к 1-му полю файла file1 и второму полю file2. sed
просто заменяет пробелы запятыми, поэтому в обоих файлах используется один и тот же разделитель. Сортировка
делает то, что написано на бутылке: сортирует ввод.