#shell
#оболочка
Вопрос:
У меня есть сценарий оболочки
#!/bin/bash
a=`grep "var lon" $1 | tr -d 'var longitude=;'`
b=`grep "var lat" $1 | tr -d 'var latitude=;'`
echo "$1,$a,$b";
У меня около 100 файлов с широтой и длительностью. который я прохожу через этот скрипт, чтобы получить его. например
, place, lat, lon . где место — имя файла.
теперь я хотел бы передать весь файл скрипту за один раз и получить все широты в одном файле.
как мне это сделать? например: один вывод для sh script.sh aus
aus,10.20,20.20
теперь я хочу передать все 100 файлов и получить 100 таких строк в одном файле.
Спасибо.
Ответ №1:
Измените свой скрипт, чтобы он принимал несколько аргументов, подобных этому:
#!/bin/bash
for arg in "$@"
do
a=`grep "var lon" "$arg" | tr -d 'var longitude=;'`
b=`grep "var lat" "$arg" | tr -d 'var latitude=;'`
echo "$arg,$a,$b"
done
Теперь вы можете передавать любые файлы, которые вам нравятся. Вы даже можете использовать подстановочные знаки. Вот несколько примеров:
# only aus
$ script.sh aus
# two files
$ script.sh aus usa
# all files beginning with a
$ script.sh a*
# all files in the current directory
# the output is written to output.txt
$ script.sh * > output.txt
Ответ №2:
Вам не нужно вызывать grep дважды:
awk -F '[=;]' '
$1 ~ /var longitude/ {lon = $2}
$1 ~ /var latitude/ {lat = $2}
END {print FILENAME, lon, lat}
' filename
затем
get_coords() {
awk -F '[=;]' '
$1 ~ /var longitude/ {lon = $2}
$1 ~ /var latitude/ {lat = $2}
END {print FILENAME, lon, lat}
' "$1"
}
for file; do get_coords "$file"; done
Если в вашей системе установлен GNU awk, вам нужно вызвать gawk только один раз:
gawk -F '[=;]' '
$1 ~ /var longitude/ {lon = $2}
$1 ~ /var latitude/ {lat = $2}
ENDFILE {print FILENAME, lon, lat}
' "$@"
Ответ №3:
Я не очень хорошо умею кодировать bash
с нуля, но вы можете перебирать все файлы и добавлять выходные данные в файл через >>
:
touch output.txt
for file in *
do
a=`grep "var lon" $file | tr -d 'var longitude=;'`
b=`grep "var lat" $file | tr -d 'var latitude=;'`
echo "$file,$a,$b" >> output.txt
done
Комментарии:
1. куда вы передаете имена файлов? просто запутался? все мои файлы находятся в одной папке. echo имеет 3 аргумента в приведенных выше сценариях. ur scrip показывает только два. где аргумент file ? пожалуйста, исправьте меня, если я ошибаюсь.
2. Извините, я думал, что это только для отладки. Я добавил его обратно. Этот скрипт считывает все имена всех файлов в папке (верхнего уровня, поэтому нерекурсивный).
3. -1: не заключайте звездочку в кавычки. Вы перебираете один файл, буквально называемый «*»