У меня есть два файла, в каждом из которых разные столбцы, разные разделители для каждого файла. И мне нужно напечатать только строки, в которых $1 в файле fileA соответствует $4 в файле fileB

Это будет работать, только если оба файла используют один и тот же разделитель столбцов:

cat ./fileA | awk -F' ' 'FNR==NR {lines[$4]; next} $1 in lines {print $0}' fileB -

ИЗМЕНИТЬ файлА:

samir x
said y
sabri z
samir y

FileB:

43,54,65,said

Как бы я использовал -F, чтобы указать другой разделитель для файла fileB? поскольку fileA использует разделитель пробелов по умолчанию.

Я старался:

cat ./fileA | awk -F' ' 'FNR==NR {lines[$4]; next} $1 in lines {print $0}' FS=',' fileB -

Но это не сработало .. есть идеи?

1
simo 3 Июн 2020 в 17:46
Я пробовал до файла B и после, но получил пустой результат
 – 
simo
3 Июн 2020 в 17:38
Я только что добавил образец контента
 – 
simo
3 Июн 2020 в 17:46
Да, это ,. Я экспериментирую с этим, чтобы использовать его с файлом CSV, разделенным ,
 – 
simo
3 Июн 2020 в 17:50

1 ответ

Лучший ответ

Пытаться

awk -F, 'FNR==NR { lines[$4] ; next ; } $1 in lines { print }' f2 FS=' ' f1

Который дает

said y
2
Archemar 3 Июн 2020 в 17:50
Спасибо, это также работало как: cat ./f1 | awk -F, 'FNR==NR { lines[$4] ; next ; } $1 in lines { print }' f2 FS=' ' - то, что я хотел
 – 
simo
3 Июн 2020 в 17:54
1
Как вам угодно, я пытался избежать бесполезного использования кота. (и, кстати, я не знал, прежде чем вы могли изменить FS в "полете").
 – 
Archemar
3 Июн 2020 в 18:16
Я знал, что это можно изменить, но я не мог понять, спасибо. Что касается cat, в моем случае я читаю несколько файлов access.log, вот где cat access.* пригодится
 – 
simo
3 Июн 2020 в 18:48
Вы можете просто использовать awk 'script' f2 FS=' ' access.*, тогда и UUOC не нужен.
 – 
Ed Morton
4 Июн 2020 в 00:12
1
Спасибо @ЭдМортон! это очень мощно.
 – 
simo
4 Июн 2020 в 17:46