Если предположить
, затем вы можете использовать cut -d' ' -f2-
для печати из файла значений, разделенных пробелом -, содержимого от второго до последнего столбца.
Ничего особенного, переберите файлы и добавьте префикс имени выходного каталога к имени файла.
outputdir=bar
mkdir -p "$outputdir"
for f in./*.txt; do
awk -f script.awk < "$f" > "$outputdir/$f"
done
Это предполагает, что входные файлы находятся в текущем каталоге, и outputdir
относится к этому. Итак, если у вас есть foo/
и bar/
на одном уровне, вам нужно cd foo
и установить outputdir=../bar
.
Если это не так, нам нужно удалить имя входного каталога из $f
. Здесь работает префикс -, удаляющий расширение ${var#pattern}
:
outputdir=./bar
inputdir=./foo
mkdir -p "$outputdir"
for f in "$inputdir"/*.txt; do
awk -f script.awk < "$f" > "$outputdir/${f#"$inputdir"}"
done
Или вы можете использовать что-то вроде "$outputdir/$(basename -- "$f")"
, если вы более знакомы с этим. (Будьте осторожны с кавычками, если у вас -некрасивые имена каталогов.)
С помощью GNU awk для редактирования «на месте»:
cp -r foo bar &&
awk -i inplace 'script' bar/*
Для полноты картины: если вы управляете скриптом, вы можете обрабатывать его там, например.
awk -vout=../bar/ '$2=="cow" {print "moo",$3,$1 > out FILENAME; next} $4!="fox" {print > out FILENAME}' *
Но это, как правило, будет хлопотно, и лично я бы выбрал другие ответы. Как отмечает Эд , с другими awk, отличными от GNU, вам, вероятно, потребуется отделить -v
и заключить в скобки >(out FILENAME)
, которые довольно незначительны, и изменить на >>
и добавить close(out FILENAME)
вызовы, которые я считаю еще хуже хлопот:-(