Как получить пустую строку, объединяющую тексты?

Есть ли способ, чтобы команда

cat *tab > newfile.tab

вставляла пустую строку между каждым скомпилированным файлом?

3
задан 25 April 2017 в 18:28

8 ответов

Использовать конструкцию for:

GLOBIGNORE=newfile.tab
for f in *tab; do cat "$f"; echo; done >newfile.tab

Expanded:

GLOBIGNORE=newfile.tab
for f in *tab; do 
    cat "$f"; echo
done >newfile.tab
GLOBIGNORE=newfile.tab - исключить newfile.tab из shell globbing, так как это наш выходной файл for f in *tab повторяет файлы, заканчивающиеся на tab cat "$f" выводит содержимое файла echo добавляет новую строку. Дескриптор файла из перенаправления >newfile.tab остается открытым на время for, т.е. открывается файл newfile.tab -closed once

Кроме того, вы можете использовать printf для форматирования один раз:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")"; done

Expanded:

for f in file.txt*; do 
    printf '%s\n\n' "$(<"$f")"
done
3
ответ дан 22 May 2018 в 23:14
  • 1
    Ничего себе, гораздо сложнее, чем я думал. Большое спасибо :) – Billy Matlock 25 April 2017 в 18:36

Использовать конструкцию for:

GLOBIGNORE=newfile.tab for f in *tab; do cat "$f"; echo; done >newfile.tab

Expanded:

GLOBIGNORE=newfile.tab for f in *tab; do cat "$f"; echo done >newfile.tab GLOBIGNORE=newfile.tab - исключить newfile.tab из shell globbing, так как это наш выходной файл for f in *tab повторяет файлы, заканчивающиеся на tab cat "$f" выводит содержимое файла echo добавляет новую строку. Дескриптор файла из перенаправления >newfile.tab остается открытым на время for, т.е. открывается файл newfile.tab -closed once

Кроме того, вы можете использовать printf для форматирования один раз:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")"; done

Expanded:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")" done
3
ответ дан 18 July 2018 в 14:17

Использовать конструкцию for:

GLOBIGNORE=newfile.tab for f in *tab; do cat "$f"; echo; done >newfile.tab

Expanded:

GLOBIGNORE=newfile.tab for f in *tab; do cat "$f"; echo done >newfile.tab GLOBIGNORE=newfile.tab - исключить newfile.tab из shell globbing, так как это наш выходной файл for f in *tab повторяет файлы, заканчивающиеся на tab cat "$f" выводит содержимое файла echo добавляет новую строку. Дескриптор файла из перенаправления >newfile.tab остается открытым на время for, т.е. открывается файл newfile.tab -closed once

Кроме того, вы можете использовать printf для форматирования один раз:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")"; done

Expanded:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")" done
3
ответ дан 24 July 2018 в 20:22

Использовать конструкцию for:

GLOBIGNORE=newfile.tab for f in *tab; do cat "$f"; echo; done >newfile.tab

Expanded:

GLOBIGNORE=newfile.tab for f in *tab; do cat "$f"; echo done >newfile.tab GLOBIGNORE=newfile.tab - исключить newfile.tab из shell globbing, так как это наш выходной файл for f in *tab повторяет файлы, заканчивающиеся на tab cat "$f" выводит содержимое файла echo добавляет новую строку. Дескриптор файла из перенаправления >newfile.tab остается открытым на время for, т.е. открывается файл newfile.tab -closed once

Кроме того, вы можете использовать printf для форматирования один раз:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")"; done

Expanded:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")" done
3
ответ дан 31 July 2018 в 13:16

Если вы не возражаете против дополнительной пустой строки после последнего файла, вы можете использовать sed, например

sed -s '$G' *.tab > newfile.tab

(для этого используется расширение GNU sed -s, которое обрабатывает входные файлы отдельно , поэтому $G удваивает пробелы в последней строке каждого файла).

Если вы не учитываете дополнительную строку, вы можете пропустить ее через другую sed:

sed -s '$G' *.tab | sed '$d' > newfile.tab

В качестве альтернативы, с awk

awk 'FNR == 1 && NR != 1 {print ""} 1' *.tab > newfile.tab
3
ответ дан 22 May 2018 в 23:14

Если вы не возражаете против дополнительной пустой строки после последнего файла, вы можете использовать sed, например

sed -s '$G' *.tab > newfile.tab

(для этого используется расширение GNU sed -s, которое обрабатывает входные файлы отдельно , поэтому $G удваивает пробелы в последней строке каждого файла).

Если вы не учитываете дополнительную строку, вы можете пропустить ее через другую sed:

sed -s '$G' *.tab | sed '$d' > newfile.tab

В качестве альтернативы, с awk

awk 'FNR == 1 && NR != 1 {print ""} 1' *.tab > newfile.tab
3
ответ дан 18 July 2018 в 14:17

Если вы не возражаете против дополнительной пустой строки после последнего файла, вы можете использовать sed, например

sed -s '$G' *.tab > newfile.tab

(для этого используется расширение GNU sed -s, которое обрабатывает входные файлы отдельно , поэтому $G удваивает пробелы в последней строке каждого файла).

Если вы не учитываете дополнительную строку, вы можете пропустить ее через другую sed:

sed -s '$G' *.tab | sed '$d' > newfile.tab

В качестве альтернативы, с awk

awk 'FNR == 1 && NR != 1 {print ""} 1' *.tab > newfile.tab
3
ответ дан 24 July 2018 в 20:22

Если вы не возражаете против дополнительной пустой строки после последнего файла, вы можете использовать sed, например

sed -s '$G' *.tab > newfile.tab

(для этого используется расширение GNU sed -s, которое обрабатывает входные файлы отдельно , поэтому $G удваивает пробелы в последней строке каждого файла).

Если вы не учитываете дополнительную строку, вы можете пропустить ее через другую sed:

sed -s '$G' *.tab | sed '$d' > newfile.tab

В качестве альтернативы, с awk

awk 'FNR == 1 && NR != 1 {print ""} 1' *.tab > newfile.tab
3
ответ дан 31 July 2018 в 13:16

Другие вопросы по тегам:

Похожие вопросы: