код awk для вывода строк с соответствующими полями, но без вывода

#awk #carriage-return

#awk #возврат каретки

Вопрос:

Я пытаюсь вывести строки в одном файле, fileB которые соответствуют параметрам в другом файле fileA , но моя попытка ничего не выводит.

fileA :

 chr1    7237    7238
chr1    7637    7637
chr1    7908    7908
chr1    8045    8045
chr1    8329    8329
chr1    8358    8358
chr1    8375    8375
chr1    8381    8381
  

fileB : (обратите внимание, что в пятой строке есть дополнительный столбец)

 130 chr1    7237    7238    0k9imgkt
135 chr1    7637    7637    b9gko
138 chr1    7908    7908    kob9g
139 chr1    8045    8045    34e5rg  4r
151 chr1    8329    8329    b
151 chr1    8346    8346    345y46htyh
151 chr1    8346    8346    76jtuj
152 chr1    8358    8358    asfge
  

Мой код:

 awk 'NR==FNR{a[$1,$2,$3];next}($2,$3,$4) in a{print $0}' fileA fileB
  

Ожидаемый результат:

 130 chr1    7237    7238    0k9imgkt
135 chr1    7637    7637    b9gko
138 chr1    7908    7908    kob9g
139 chr1    8045    8045    34e5rg  4r
151 chr1    8329    8329    b
152 chr1    8358    8358    asfge
  

Фактический вывод:

 
  

Комментарии:

1. GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2) Авторское право (C) 1989, 1991-2016 Фонд свободного программного обеспечения.

2. Попробуйте awk 'NR==FNR{a[$1,$2,$3];next}($2,$3,$4) in a' fileA fileB | cat -v . Видите какие- ^M -либо?

Ответ №1:

Это происходит, когда входные файлы имеют окончания строк Windows (т. е. rn ). Исправьте входные файлы с помощью dos2unix инструмента, и ваша команда будет работать.

 dos2unix fileA fileB
  

Или, если вы используете gawk или mawk, установите разделитель записей на rn :

 awk -v RS='rn' ...
  

Комментарии:

1. @DangIt да, я знаю, я просто хотел добавить это в качестве ответа

Ответ №2:

Вы можете попробовать с tr и grep :

 < fileA tr -d 'r' | grep -f - fileB