#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