как мне передать все файлы в папке в сценарий оболочки и получить результат в одном файле?

#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: не заключайте звездочку в кавычки. Вы перебираете один файл, буквально называемый «*»