Вот один способ:
awk -vhead="$(tr '\n' ' ' <file2)" 'BEGIN{print head}{print}' file1 > newfile
Команда tr
заменяет символы новой строки пробелами, преобразовывая «столбец» в file2
в «строку». Он передается в awk
как переменная head
, которая печатается раньше всего. Затем каждая строка входного файла просто печатается.
В качестве альтернативы вы можете сделать все это в awk
:
awk 'NR==FNR{printf "%s ",$0; next}FNR==1{print ""}1;' file2 file1 > newfile
NR
- номер текущей строки ввода, а FNR
- номер строки текущего файла. Эти два будут равны только при чтении 1-го файла. printf "% s", $ 0; next
напечатает текущую строку без \ n
в конце и перейдет к следующей. FNR == 1 {print ""}
предназначен только для добавления \ n
после того, как заголовок был напечатан, а 1;
- это awk
сокращение для «распечатать эту строку».
Просто дополнительная информация к вышесказанному,
Вам следует использовать find
вместо ls
, если вы хотите обработать вывод, он имеет некоторые фьючерсы, которые больше подходят (например, -print0
) для передачи результатов другим приложениям.
В приведенном выше случае вы можете использовать его следующим образом,
find . -type f | wc -l
который выведет список всех файлов в текущем каталоге.
bash-4.1$ ls
1. total 44
2. -rw-r--r-- 1 comp 11595 Sep 4 22:51 30.xls.txt
3. -rw-r--r-- 1 comp 14492 Sep 4 22:51 A.pdf.txt
4. -rw-r--r-- 1 comp 8160 Sep 4 22:51 comparison.docx.txt
5. -rw-r--r-- 1 comp 903 Sep 4 22:51 Survey.pdf.txt
6. -rw-r--r-- 1 comp 1206 Sep 4 22:51 Steam Table.xls.txt
Верно, в выводе 6 строк. Вы можете использовать: ls -1
, который соответствует формату одного столбца и выглядит так:
ls -1
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
Теперь wc -l
возвращает правильное количество файлов:
ls -1 | wc -l
8
Как уже упоминалось другими, делает ls | wc -l
не всегда является надежным способом подсчета количества файлов в каталоге.
Вот несколько надежных способов:
Вы можете заставить find
напечатать .
для каждого найденного файла и наберите wc -l
, чтобы подсчитать количество строк:
find. -тип f -printf '. \ n' | wc -l
Если в каталоге не так много файлов, вы можете сохранить имена файлов в массиве, а затем получить длину массива:
для f in *; сделать [-f "$ f"] && files + = ("$ f"); done && echo "$ {# files [@]}"
Для всех файлов и каталогов это становится проще:
files = (*) && echo "$ {# files [@]} "
Пример:
$ touch $'foo\nbar' 'foo bar' spam
$ ls | wc -l
4
$ find . -type f | wc -l
4
$ find . -type f -printf '.\n' | wc -l
3
$ for f in *; do [ -f "$f" ] && files+=("$f"); done
$ echo "${#files[@]}"
3
Это не работает, потому что wc -l
возвращает количество строк вывода команды ls
, что в данном случае включает всего 44
. Поскольку ваша оболочка имеет псевдоним для ls
как ls -cml
, вы получаете дополнительную информацию, которая портит ваш вывод.
Вместо этого используйте команду «ls» -Aq | wc -l
. Команда -A выводит список всех файлов в каталоге, включая файлы точек, но исключает .
и ..
. Цитаты здесь важны - они игнорируют псевдоним и запускают напрямую / bin / ls
.
-q
гарантирует, что все имена файлов печатаются только в одной строке, даже если они содержат символы новой строки (которые затем будут отображаться как ?
).
wc
- это счетчик символов, слов и строк, а не счетчик файлов.
Вы, программист / автор сценария, несете ответственность за то, чтобы подсчитывать то, что вы хотите, и соответственно корректировать расчет.
В вашем случае вы можете сделать что-то вроде:
echo $((`ls|wc -l`-1))
Наконец, обратите внимание, что ваш ls
, вероятно, является псевдонимом, поскольку он дает длинный список, который не является обычным ls
без аргументы. Поэтому может быть хорошей идеей обратиться к полному пути ls
(обычно / bin / ls
), чтобы избежать путаницы.