Cambie la línea if
a:
if [ "$filename" != even ] && [ "$filename" != odd ]
En el shell bash
, todo el script,(es decir, de for
a done
inclusive ), se puede simplificar a:
GLOBIGNORE=even:odd ; printf "%s\n" *
Otro bash
método:
shopt -s extglob # only needs to be done once, if not set already.
printf "%s\n" !(odd|even)
while read -r tag line; do
printf '%s\n' "$line" >"$tag".txt
done <text.in
Когда вы читаете две переменные с помощью read
, первое слово помещается в первую переменную, а остальная часть строки - во вторую.
Что считать "словом", зависит от значения параметра $IFS
. По умолчанию read
разбивает строку на слова на основе пробелов, табуляции или новой строки.
Цикл использует это для вывода строки (за вычетом первого слова, или "тега") в файл, имя которого берется из начала строки.
удалось это сделать:
#!/bin/bash
while read -r filename content ; do
printf '%s\n' "$content" >> "${filename}.txt"
done < some_file.txt
Нет необходимости в bash
:
awk '{file = $1".txt"; $1=""; print substr($0,2) > file; close(file)}' a_text_file
файл
из первого столбца, добавьте к нему .txt
.
. Между тем, об этом while
цикле в bash
:
$ (echo first; echo -n second) | while read line; do echo $line; done
first
$
Ммм, тихая потеря данных. Лучше убедитесь, что есть всегда окончательные символы новой строки, а?