Я хочу сортировать файл на основе информации столбца

Простейшим подходом, вероятно, будет 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 печатать только строки, соответствующие регулярному выражению.

0
27.12.2018, 21:45
3 ответа

Мне удалось добиться этого с помощью следующего:

sed 's/ACTIVOS/\&/g' input | sort -n -t \& -k2 | sed 's/\&/ACTIVOS/g'
  1. Сначала мы заменим ACTIVOSодним символом (, потому что сортировка может использовать только один символ-разделитель ). Это рискованно, если ваш файл может содержать символ &, но этот символ можно заменить, если вы знаете другой символ, которого точно не будет в вашем вводе.
  2. Теперь мы сортируем вывод численно на основе второго столбца (всего после вновь добавленного&)
  3. Теперь заменяем временный &обратно на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
0
28.01.2020, 04:06

Что-то вроде этого достаточно при тестировании с вашим образцом....

cat textfile | sort -V

Если вы используете сортировку с расширением GNU (или, другими словами, если вы используете GNU/Linux или Unix -, например, с сортировкой, имеющей расширения GNU )...

Дайте мне знать, если это работает для всего вашего текста, и если да, пожалуйста, не забудьте выбрать этот ответ как правильный.

Удачи!

0
28.01.2020, 04:06

Другой способ приблизиться к этому — как-то разграничить поля; ниже используется символ подчеркивания для их разделения, а затем указывается 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:
                                     __
                        _____
________________________________________________________________________
0
28.01.2020, 04:06

Теги

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