Як можна об'єднати файли з розділенням даних у bash?


6

Отже, можна легко приєднати файли в bash з cat:

cat *.txt > all.txt

Але що, якщо хтось хоче вставити щось між вхідними файлами, як, наприклад, подача рядка?

Відповіді:


6

Вимагає GNU sed:

sed -s '$G' *.txt > all.txt

додайте рядок з 8 тире і новий рядок після кожного файлу

sed -s '$a--------' *.txt

Ви можете використовувати ваш sed '$ d' з цим

Порівняйте з ними:

Вставити рядок тире перед кожним файлом:

sed -s '1i--------' *.txt

Зробіть те ж саме, але без рядка після тире:

sed -s '1s/^/--------/' *.txt

Покладіть рядок тире на кінець останнього рядка кожного файлу:

sed -s '$s/$/--------/' *.txt

Обведіть кожен файл фігурними дужками:

sed -s -e '1i{' -e '$a}' *.txt

Елегантне рішення для вставки рядків, я зробив невелику модифікацію, щоб мати лише ліфід між вихідними файлами не в кінці: sed -s '$ G' * .txt | sed '$ d' & gt; all.txt Але чи може цей метод також використовувати для вставки інших даних, щоб бути більш відповідними загальному запиту?
Roger Ertesvag

@Roger: sed -s '$a--------' *.txt після кожного файлу додаватиме рядок з 8 тире і рядка. Ви можете використовувати свій sed '$d' З цим. Порівняйте з ними: sed -s '1i--------' *.txt, sed -s '1s/^/--------/' *.txt, sed -s '$s/$/--------/' *.txt і sed -s -e '1i{' -e '$a}' *.txt
Dennis Williamson

Ви могли б додати ці варіанти до відповіді?
Roger Ertesvag

6

В якості одного лайнера з оболонками:

( for i in *.txt ; do cat $i ; echo 'separator here' ; done ) >all.txt

Ось що виконує підрозділ, розділений на рядки стилю сценарію:

for i in *.txt
do
cat $i
echo 'separator goes here' 
done

У цьому прикладі роздільник діє як нижній колонтитул; додайте заголовок, додавши інший echo перед cat.


2
Немає необхідності в підгрупі, і ви повинні використовувати подвійні лапки навколо розширення змінної, щоб захистити будь-який пробіл у іменах файлів. for i in *.txt; do cat "$i"; echo 'stuff'; done > all.txt
Chris Johnsen

Чи можна це змінити, щоб не вставляти роздільник у кінці файлу результату, тільки між вихідними файлами?
Roger Ertesvag

@Roger: files=(*.txt); indices=(${!files[@]}); for i in ${indices[@]}; do cat "${files[i]}"; if [[ $i != ${indices[@]: -1} ]]; then echo "separator"; fi; done > all.txt
Dennis Williamson

1
catWithSep() { sep="$1"; shift; first=''; for f; do test -n "$first" && echo "$sep"; cat "$f"; first=no; done; }; catWithSep separator *.txt
Chris Johnsen

@Chris: приємний!
Dennis Williamson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.