Как извлечь ряд строк из очень большого файла с известной позиции?

langs— это не массив, а строка в вашем коде.

Чтобы сделать его массивом и использовать:

langs=( EN GE )
dir_EN=/xx
dir_GE=/zz

dir_ml=()
for i in "${langs[@]}"; do
    declare -n p="dir_$i"
    dir_ml+=( "$p" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

В приведенном выше цикле $iпо очереди принимает значения ENи GE. Это также вводит ссылку на имя переменную p. При доступе к значению pстрока, которая была присвоена переменной при ее объявлении, будет интерпретироваться как имя переменной, и будет возвращено значение этой переменной.

Результатом вышеизложенного будет

dir_ml = "/xx"
dir_ml = "/zz"

Чтобы использовать ссылки на имена в bash, вам потребуется bashверсии 4.3 или выше.


Другая (интересная, но худшая )возможность:

dir_EN=/xx
dir_GE=/zz

# (can't set dir_ml=() here as its name would be picked up by the loop)
unset dir_ml

for i in "${!dir_@}"; do
    dir_ml+=( "${!i}" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

Здесь $iбудет принимать значения имен переменныхdir_ENи dir_GEпо очереди. Затем мы используем косвенную переменную с ${!i}, чтобы получить значение этой переменной. Этот вариант не нуждается в массиве langs, но вместо этого предполагает, что никакая другая переменная не имеет имениdir_-что-то (, что может считаться немного хрупким, поскольку пользователь может легко вводить переменные с такими именами в окружение скрипта ).

Вывод для этого кода такой же, как и для кода выше.

-2
18.12.2019, 01:46
3 ответа

Вы можете извлечь диапазон строк, используя awk. Следующая команда извлечет 2 -6 строк (включительно )из FILENAME и запишет их в ВЫВОД.

cat FILENAME | awk 'NR >= 2 && NR <= 6' > OUTPUT

Вы также можете сделать извлечение из известной позиции до конца файла, как это

cat FILENAME | awk 'NR >= 2' > OUTPUT

NRозначает «Числовая запись»

.

Вы также можете динамически получить номер строки с помощью grep и передать его команде awkдля извлечения этих строк

LINE_START=`grep -nr "STRING" FILENAME | grep -o '^[0-9]\+'`
cat FILENAME | awk 'NR >= $LINE_START' > OUTPUT
-1
28.01.2020, 05:18

На самом деле я могу легко открыть его с помощью Notepad++, а затем просто Ctrl+F для поиска.

-2
28.01.2020, 05:18

grep -A200 searchword file.xmlможно использовать для вывода 200 строк после каждого совпадения. searchword— это слово, которое вы ищете, а file.xml— это имя файла XML.

Вы также можете использовать -B200для вывода 200 строк перед каждым соответствием и -C200для вывода 200 строк до и 200 строк после.

Обратите внимание, что правильный синтаксический анализатор XML почти всегда лучше, чем использование grep или регулярного выражения:

https://stackoverflow.com/a/1732454/131264

1
28.01.2020, 05:18

Теги

Похожие вопросы