Вы можете попробовать что-то вроде этого:
$ awk '/After/{a=1;next}/Before/{a=0}; (a==1){print NR" : "$0}' file
5 : Address1
6 : Address2
7 : Address3
13 : Address1
14 : Address2
15 : Address3
21 : Address1
22 : Address2
23 : Address3
29 : Address1
30 : Address2
31 : Address3
37 : Address1
38 : Address2
39 : Address3
Идея очень проста. Переменная a
изменяет значение, если текущая строка соответствует After
или Before
, и мы печатаем строку, только если a
равно 1.
Чтобы сохранить их в отдельные выходные файлы, вы можете сделать:
awk '/After/{a=1; k++;next}/Before/{a=0}; (a==1){print NR" : "$0 > k".out"}' file
Здесь я использую переменную k
, чтобы подсчитать, сколько раз будет найдено слово после
. Выходным файлом будет текущее значение k
и .out
. Если я выполню приведенное выше в вашем примере, я получу:
$ ls
1.out 2.out 3.out 4.out 5.out
Como mencioné en un comentario, si no necesita la clasificación de versiones (sort -V
), simplemente puede hacer sox *wav
. En Linux, *wav
experimentará una expansión de nombre de archivo, lo que dará como resultado una lista de nombres de archivo ordenados alfabéticamente. Esto se ve afectado por la configuración regional, particularmente LC_COLLATE
, que puede buscar en Google para obtener más información.
Si necesita sort -V
, la forma correcta de manejar esto es con cadenas y matrices terminadas en nulo para manejar nombres de archivo con espacios y otros caracteres especiales.Este script colocará la salida del comando sort
en una matriz y ejecutará sox
con esta lista.
#!/bin/bash
unset wav_files
while IFS= read -r -d '' file; do
wav_files+=("$file")
done < <(find. -maxdepth 1 -type f -name "*wav" -print0 | sort -V -z)
if (( ${#wav_files[@]} == 0 )); then
echo "No wav files found"
else
sox -- "${wav_files[@]}"
fi
Esto puede ser más de lo que esperaba, pero es una buena práctica;)
Si y solo si sus nombres de archivo son "buenos" y no contienen espacios en blanco o caracteres especiales (esp. caracteres glob ), la salida fácil es ejecutar sort
en una sustitución de comando:
sox $(printf "%s\n" *.wav | sort -V) output.wav
El printf
aquí funciona para poner nuevas líneas(\n
)después de cada nombre de archivo.
(Como de costumbre, una expansión sin comillas como esa se interrumpirá si los nombres de los archivos tienen espacios o tabulaciones (, se dividirán en dos después de expandir $(...)
); o líneas nuevas (se dividirán en dos antes desort
); o caracteres globales (*?[]
, se expandirán a cualquier nombre de archivo coincidente ). Así que no hagas eso si no sabes que los nombres de los archivos son lo suficientemente buenos. Véase, por ejemplo.https://mywiki.wooledge.org/WordSplittingy ¿Cuándo es necesaria la cita doble -?