2017-02-09 8 views
-1

Я ищу путь, чтобы сначала поместить номера строк 5, 7 и 8, а затем остальные строки:как положить линии 4, 5 и 30 в начале, а затем остальные строки

файл у меня есть выглядит следующим образом:

3 0.14239002E-02 0.22510807E-04 -0.26742979E-05 
4 0.57704593E-03 0.68034193E-03 0.68119554E-03 
5 0.64948134E-03 0.18797759E-04 0.92341181E-04 
6 -0.70701827E-03 0.14093323E-02 -0.88504803E-04 
7 -0.99123291E-03 0.53649558E-05 0.56815134E-03 
8 -0.10869857E-02 0.17371795E-02 -0.25683281E-03 
9 -0.16270520E-02 -0.44482889E-06 -0.97268563E-05 

Мне нужен выход, чтобы быть похожим:

5 0.64948134E-03 0.18797759E-04 0.92341181E-04 
7 -0.99123291E-03 0.53649558E-05 0.56815134E-03 
8 -0.10869857E-02 0.17371795E-02 -0.25683281E-03 
3 0.14239002E-02 0.22510807E-04 -0.26742979E-05 
4 0.57704593E-03 0.68034193E-03 0.68119554E-03 
6 -0.70701827E-03 0.14093323E-02 -0.88504803E-04 
9 -0.16270520E-02 -0.44482889E-06 -0.97268563E-05 

Любой предлагают использовать sort или awk или какой-то хороший способ, спасибо.

+0

Вы упоминаете 'sort', но ваш желаемый результат не сортируется. –

+0

спасибо, на самом деле, я точно не знаю, как это возможно, я только догадывался –

+0

Я могу предлагать, используя, возможно, grep строку 5 7 8 в отдельный файл и поместить остальные строки после удаления 5 7 8 строк в другой файл, а затем cat их, но, возможно, был бы более простой способ. –

ответ

1

Если вы не возражаете, чтение файла в два раза, то вы можете сделать это с AWK:

awk '(NR == FNR && (FNR == 5 || FNR == 7 || FNR == 8)) \ 
    || (NR != FNR && !(FNR == 5 || FNR == 7 || FNR == 8))' file file 

Или, если вы предпочитаете, и ваша версия AWK поддерживает его, то вы можете использовать xor:

awk '!xor(NR == FNR, FNR == 5 || FNR == 7 || FNR == 8)' file file 

Если это содержимое первого поля $1, что вы хотите, а не номер строки NR, а затем измените сравнения FNR == 5 на $1 == 5 и т.д.

Результат команды переходит к стандартным выводам. Если вы хотите перенаправить его в файл, добавьте перенаправление в конец команды.

+0

спасибо, я пробовал с этим, но ничего не менял тот же файл, который я получил, это файл, я должен написать тот же самый файл, и я возвращаю результат в файл> file1 –

+0

Да, вам нужно перенаправить вывод на другой файл. –

+0

Я сделал, но наш pur был продублирован без изменений –

0

Общего раствор

awk -v NewOrder='5 7 8' ' 
    # prepare the list 
    BEGIN{ 
     NOSize = split(NewOrder, NOs) 
     for (i=1; i<=NOSize; i++) Big = Big < NOs[i] ? NOs[i] : Big 
     } 

    # print line out of scope (of order change) 
    $1 > Big { print;next} 

    # load in memory line until last order change 
     { Ls[$1]=$0; Rs[++j]=$1 } 

    # when reaching last line to print in other order, print the new order content 
    $1 == Big { 
     #print new line first 
     for (k=1; k<=NOSize; k++){i=NOs[k];print Ls[i]; Ps[i]=1} 
     # print the other in FIFO order 
     for (k=1; k<=(j-1); k++) {i=Rs[k];if (! Ps[i]) print Ls[i]} 
     } 
    ' YourFile 
  • поместить список списка с рисунком изменить в переменной NewOrder отдельного пробела
  • занять первое поле в качестве опорного, а не номера строки для линии переупора
+0

ему нужно что-то запустить. поскольку, когда я отправил chnging мое имя файла, он останавливается, не делая ничего. –

+0

normaly просто адаптирует ваше имя файла (YourFile) и * order * list. Для отладки поместите некоторые 'print 'здесь'' в разделы – NeronLeVelu

 Смежные вопросы

  • Нет связанных вопросов^_^