Простейшим подходом, вероятно, будет awk
:
awk -F'|' '$4~/^5/' file
-F '|'
устанавливает разделитель полей на |
. $ 4 ~ / ^ 5 /
будет истинным, если 4-е поле начинается с 5
. Действие по умолчанию для awk
, когда что-то оценивается как истина, - это распечатать текущую строку, поэтому приведенный выше сценарий напечатает то, что вы хотите.
Другие варианты:
Perl
perl -F '\ |' -ane 'print if $ F [3] = ~ / ^ 5 /' file
Та же идея. Переключатель -a
заставляет perl
разбивать свои поля ввода по значению, заданному -F
, в массив @F
. Затем мы печатаем, если 4-й элемент (поле) массива (массивы начинают отсчет с 0) начинается с 5
.
grep
grep -E '^ ([^ |] * \ |) {3} 5' file
Регулярное выражение будет соответствовать строке не- |
, за которым следует |
3 раза, а затем 5
.
GNU или BSD sed
sed -En '/ ([^ |] * \ |) {3} 5 / p' файл
-E
включает расширенные регулярные выражения, а -n
подавляет нормальный вывод. Регулярное выражение такое же, как grep
выше, а p
в конце заставляет sed
печатать только строки, соответствующие регулярному выражению.
Мне удалось добиться этого с помощью следующего:
sed 's/ACTIVOS/\&/g' input | sort -n -t \& -k2 | sed 's/\&/ACTIVOS/g'
ACTIVOS
одним символом (, потому что сортировка может использовать только один символ-разделитель ). Это рискованно, если ваш файл может содержать символ &
, но этот символ можно заменить, если вы знаете другой символ, которого точно не будет в вашем вводе. &
)&
обратно наACTIVOS
С вводом образца:
$ cat input
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out::: Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out::: Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out::: Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out::: Total energy:
$ sed 's/ACTIVOS/\&/g' input | sort -n -t \& -k2 | sed 's/\&/ACTIVOS/g'
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out::: Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out::: Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out::: Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out::: Total energy:
на основе вашей команды вы сможете сделать что-то вроде:
grep -R ':: RASSCF root number 1 Total energy:' * | sed 's/ACTIVOS/\&/g' | sort -n -t \& -k2 | sed 's/\&/ACTIVOS/g' > outputCASSCF.txt
Что-то вроде этого достаточно при тестировании с вашим образцом....
cat textfile | sort -V
Если вы используете сортировку с расширением GNU (или, другими словами, если вы используете GNU/Linux или Unix -, например, с сортировкой, имеющей расширения GNU )...
Дайте мне знать, если это работает для всего вашего текста, и если да, пожалуйста, не забудьте выбрать этот ответ как правильный.
Удачи!
Другой способ приблизиться к этому — как-то разграничить поля; ниже используется символ подчеркивания для их разделения, а затем указывается sort
для сортировки чисел, начиная с позиции 8 в поле 4; в случае дублирования в поле 4 используйте поле 3:
sort -t_ -k4.8n -k -k3,3 input
Вывод --debug
на входе выборки выглядит следующим образом:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out::: Total energy:
_
_____
________________________________________________________________________
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out::: Total energy:
_
_____
________________________________________________________________________
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out::: Total energy:
__
_____
________________________________________________________________________
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out::: Total energy:
__
_____
________________________________________________________________________