Различия, сортировка и извлечение первой строки нового файла - PullRequest
0 голосов
/ 07 августа 2020

У меня два файла csv . Что мне нужно сделать, так это получить заголовок нового файла и diff два файла csv независимо от их сортировки.

У меня есть следующая команда

cat new-file.txt | 
bash -c "diff --new-file --speed-large-files \
--new-line-format=%L --old-line-format= \
--unchanged-group-format= \
<(sort <(tail -n+2 old-file.txt)) <(head -n 1 -; sort <(tail -n+2 -))"

Все должно быть внутри bash -c, так как я использую какую-то программу, которая требует этого. Также необходимо передать new-file.txt .

Приведенная выше команда не имеет правильного вывода, но когда я использую что-то вроде этого:

cat new-file.txt | 
bash -c "diff --new-file --speed-large-files \
--new-line-format=%L --old-line-format= \
--unchanged-group-format= \
<(sort <(tail -n+2 old-file.txt)) <(sort <(tail -n+2 -))"

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

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Попробуйте изменить самую последнюю замену процесса:

 <(head -n 1 -; sort <(tail -n+2 -))"

... на:

 <( tee >(head -n 1)  >(sleep .1; sort <(tail -n+2 -)) > /dev/null )"
0 голосов
/ 07 августа 2020

Когда вы запускаете программу, дескриптор ввода привязан к этой программе. Из-за того, как работает буферизация, утилиты будут читать более одной строки, иногда весь ввод, а в случае head выводить только первую строку. Из-за этого следующая команда обычно ничего не читает. Лучший и надежный способ - использовать встроенные команды read и printf (что, к сожалению, требует немного большего набора текста).

< new-file.txt diff ... <(IFS= read -r first_line; printf "%s\n" "$first_line"; the_rest)
# or
< new-file.txt diff ... <(IFS= read -r; printf "%s\n" "$REPLY"; the_rest)
# or I usually do single char variable
< new-file.txt diff ... <(IFS= read -r l; printf "%s\n" "$l"; the_rest)

Ваша команда будет выглядеть так:

< new-file.txt bash -c "diff --new-file --speed-large-files --new-line-format=%L --old-line-format= --unchanged-group-format= <(sort <(tail -n+2 old-file.txt)) <(IFS= read -r l; do printf \"%s\\n\" \"\$l\"; sort <(tail -n+2 -))"
# or
< new-file.txt bash -c 'diff --new-file --speed-large-files --new-line-format=%L --old-line-format= --unchanged-group-format= <(sort <(tail -n+2 old-file.txt)) <(IFS= read -r l; do printf "%s\n" "$l"; sort <(tail -n+2 -))'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...