Unix - как объединить имя файла внутри контента с кошкой и базовой линии? - PullRequest
1 голос
/ 11 мая 2019

Я хочу объединить файлы (одна строка) с именем файла в начале строки.

'cat' выполняет слияние файлов, а 'basename -a' выдает файловые файлы, но я не знаюкак получить оба?

$ echo "content1" > f1.txt
$ echo "content2" > f2.txt
$ cat f*.txt > all.txt

$ cat all.txt
content1
content2

$ basename -a f*.txt
f1.txt
f2.txt

Would like this result :
$ cat all.txt
f1.txt  content1
f2.txt  content2

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Просто используйте grep -H.Постобработка для изменения разделителя:

$ for i in 1 2; do echo content$i > f$i.txt; done
$ grep -H . *.txt 
f1.txt:content1
f2.txt:content2
$ grep -H . *.txt  | sed 's/:/  /'
f1.txt  content1
f2.txt  content2

или

$ awk '{printf "%s\t%s\n", FILENAME, $0}' *.txt
f1.txt  content1
f2.txt  content2
1 голос
/ 11 мая 2019

Используйте цикл.Выполните итерацию по каждому файлу *.txt, отобразите его имя в выходном файле без новой строки (с помощью echo -n,), добавьте его содержимое в выходной файл и, наконец, добавьте новую строку.Обратите внимание, что >> добавляет.Использование > приведет к перезаписи.

rm -f all.txt
for f in *.txt; do echo -n "$f " >> all.txt; cat "$f" >> all.txt; echo >> all.txt; done

Если ваши входные файлы уже содержат символ новой строки в конце, тогда вы пропускаете последний echo и просто делаете:

for f in *.txt; do echo -n "$f " >> all.txt; cat "$f" >> all.txt; done

Есливы используете tcsh вместо bash, тогда вы можете использовать foreach, но вы не можете написать весь цикл в одной команде.Обычно вы пишете это в сценарии:

foreach f (*.txt)
    echo -n "$f " >> all.txt
    cat "$f" >> all.txt
end

Чтобы получить это в одной командной строке, вам нужно что-то вроде этого:

printf 'foreach f (*.txt)\n echo -n "$f " >> all.txt\n cat "$f" >> all.txt\n end' | tcsh
...