Переместить определенную строку с позиции на другую

РЕШЕНИЕ:Я понял, что эта ошибка возникла, потому что моя установка Python находилась в моем каталоге home. Таким образом, у Apache не было разрешения на доступ к среде.

Чтобы решить эту проблему, я сделал следующее:

Удалена моя установка anaconda3:

[ec2-user@ip] ~ $ rm -rf anaconda3/
# -- be sure to remove directories.conda/ and.anaconda_backup/ -- #
# -- these should be in the same directory as the anaconda3/ directory -- #

Re -установил anaconda3 как root в каталог /usr/local(, доступный всем пользователям, работает с Apache):

[ec2-user@ip] ~ $ sudo su -
[root@ip] ~ $ cd /usr/local
[root@ip] ~ $ wget https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh 
                  # ^ whichever version you want. Go to https://repo.continuum.io/archive/
[root@ip] ~ $ bash Anaconda3-5.1.0-Linux-x86_64.sh
    # specify your path when prompted --> /usr/local/anaconda3
    # note that directory /usr/local/anaconda3 cannot exist prior to running the command

Добавьте строку export PATH='/usr/local/anaconda3/bin:$PATH'в конец вашего файла /root/.bashrc КАК ПОЛЬЗОВАТЕЛЯ ROOT! (отредактируйте старый путь к anaconda3, если он уже существует в конце этого файла)

[root@ip] ~ $ vi /root/.bashrc # -- add/edit the line here -- #
[root@ip] ~ $ source /root/.bashrc

Убедитесь, что пользователь root использует правильную версию Python:

[root@ip] ~ $ which python
/usr/local/anaconda3/bin/python

Выйти как пользователь root:

[root@ip] ~ $ exit

Убедитесь, что правильная версия Python работает как пользователь по умолчанию:

[ec2-user@ip] ~ $ which python
/usr/local/anaconda3/bin/python

Если это печатает /usr/bin/pythonили что-то другое, чем /usr/local/anaconda3/bin/python, убедитесь, что вы добавили PATH, указанный выше, в файл ~/.bashrc вашего пользователя (, точно так же, как вы делали это как пользователь root)

ПРИМЕЧАНИЕ. :Все новые установки/настройки среды теперь должны выполняться с правами ROOT. т.е.:

[ec2-user@ip] ~ $ sudo su -
[root@ip] ~ $ conda install flask
...
[root@ip] ~ $ exit
# -- open Python to verify that your installation worked -- #
[ec2-user@ip] ~ $ python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 18:10:19)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
# -- shouldn't throw an ImportError -- #
>>> exit()

Если кто-то наткнется на это в будущем, КОММЕНТАРИЙ! Я хотел бы быть в состоянии предложить некоторую помощь.

Удачи!

4
23.02.2020, 10:33
5 ответов
sed -n '1h;2,10H;11G;11,$p' 

Первая строка, скопируйте hиз-за новой строки, затем добавьте Hдо 10.

В строке 11 получите место для удержания

От 11 до конца, распечатать.


]#  sed -n '1h;2,10H;11G;11,$p' bonj 
French: Bonjour 
English: Hello 
Turkish: Marhaba 
Italian: Ciao 
German: Hallo 
Spanish: Hola 
Latin: Salve 
Greek: chai-ray 
Welsh: Helo 
Finnish: Hei 
Breton: Demat 

Так лучше:

]# seq 20 | sed -n '1h;2,10H;11G;11,$p' 
11
1
2
3
4
5
6
7
8
9
10
12
13
14
15
16
17
18
19
20

Я беру твой пример:

]# sed -e 1p -e 11p -n bonj 
English: Hello 
French: Bonjour 

...с переключателем -nв конце, чтобы показать, что он учитывается для обоих выражений.

У меня также есть -n, а затем 1h;2,10H, который должен быть просто 1,10H, который представляет собой диапазон номеров строк и команду «удерживать» (сохранить ). Пока ничего не печатается.

11,$p— другой диапазон. В строке 11 печатается то, что `11G' только что получил из удержания (, т.е. 1 -10 ), и добавляется к строке 11.

Строки с 12 по $ просто печатаются сами по себе из-за -n.


Я должен сделать два -eтаких, как ты:

sed -n -e '1h;2,10H' -e '11G;11,$p'

От 1,10 - холд, от 11,$ - печать.


В строке 11 сначала G, затем p. Это важно, потому что:

]# seq 20 | sed -n -e '1h;2,10H' -e '11,$p;11G'
11
12
13
14
15
16
17
18
19
20

Здесь строка 12 стирает то, что строка 11 получила после печати.


Как функция с параметрами

Всегда скучно в одиннадцатой строке с функцией "поместить первым":

]# declare -f putfirst 
putfirst () 
{ 
    e="1h;2,$(($1-1))H;${1}G;${1},\$p";
    sed -ne "$e" $2
}

Два шага :генерация строки, затем вызов sed. "$" имеет два значения :"p" не является переменной!

Это наименьшее число, которое работает:

]# seq 7 | putfirst 3 
3
1
2
4
5
6
7

Или с исходным файлом "bonj":

]# putfirst 4 bonj | putfirst 6 |head -4
Latin: Salve 
German: Hallo 
English: Hello 
Turkish: Marhaba 

Это два sed подряд, но теперь выполняются две операции.


Перл

perl -ne '$n++; $h.=$_ if $n<11; print $_.$h if $n==11; print if $n>11' <(seq 20)

И как некий скрипт, который принимает имя файла и не нуждается в опциях:

$want=11 ;
while (<>) {
    $n++ ;
    if ($n < $want)            # before $want: store line
        { $lowlines.= $_ ; 
          next }               # next line (avoids 'else')  
    if ($n == $want)           # at line $want: append stored lines to $_    
        { $_.= $lowlines }   
    print ;                    # print $_ for $n not less than $want
}

AWK(украдено у Эда (не редактор!))

NR < 11 { 
    buf[NR] = $0; next 
}
NR >=11 {
    print
    if (NR == 11) {
        for (i=1; i<11; i++) { print buf[i] }
    }
}

Я использовал NRвместо увеличения nи сделал поток более явным. Тот же «трюк» :упрощает nextнисходящий поток.


Сperl -n

$n++ ;
$tmp = $tmp. $_  if $n < 11  ; 
print  $_. $tmp  if $n == 11 ;
print  $_         if $n > 11  ;

Это лучший формат. Симметричный.

3
28.04.2021, 23:22

Если я правильно понял, вы просто хотите переместить 11-ю строку на первую строку.

Итак, если ваш оригинал выглядел как

Original line 1
Original line 2
...
Original line 18
Original line 19
Original line 20

Тогда результатом будет

Original line 11
Original line 1
Original line 2
...
Original line 9
Original line 10
Original line 12
Original line 13
...
Original line 19
Original line 20

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

( sed -n '11 {p;q}' file ; sed 11d file ) > newfile

По сути, первая команда sedпечатает только строку 11, а затем завершает работу. Вторая команда sedпечатает каждую строку , кроме строки 11.

В результате строка 11 фактически перемещается в начало нового файла.

3
28.04.2021, 23:22

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

awk '
NR < 11 { buf = buf $0 ORS; next }
{
    print
    printf "%s", buf
    buf = ""
}
' file > new_file

напр.:

$ seq 15 | awk '
NR < 11 { buf = buf $0 ORS; next }
{
    print
    printf "%s", buf
    buf = ""
}
'
11
1
2
3
4
5
6
7
8
9
10
12
13
14
15

Исходный ответ с использованием массива вместо скалярной переменной для буфера:

awk '
NR < 11 { buf[++bufSz] = $0; next }
{
    print
    for (i=1; i<=bufSz; i++) {
        print buf[i]
    }
    bufSz = 0
}
' file > new_file

напр.:

$ seq 15 | awk '
NR < 11 { buf[++bufSz] = $0; next }
{
    print
    for (i=1; i<=bufSz; i++) {
        print buf[i]
    }
    bufSz = 0
}
'
11
1
2
3
4
5
6
7
8
9
10
12
13
14
15
2
28.04.2021, 23:22

СPOSIX sed:

$ sed -e '1,11!b' -e '11!H;1h;11!d;G' file

Использованиеperl:

$ perl -lne '
   push(@A,$_),next if $. < 11;
   print for $_, splice @A;
' file

Использованиеbash:

$ (head -n 11 - | tee log | tail -n 1 -; head -n 10 log; cat -;) < file
0
28.04.2021, 23:22

Более простой sed, чем выложенные (POSIX, без меток):

seq 20 | sed '1,10{H;1h;d;};11G'

Это :в строках с 1 по 10, заполните пробел этими строками (не печатайте ). В строке 11 верните пробел и позвольте sed использовать значение по умолчанию с этого момента :, просто печатайте каждую строку. Обратите внимание, что после строки 11 сценарий не является операцией -, просто оставьте sed по умолчанию, может быть, быстрее.

В ОК:

awk 'NR <11{ hold=hold RS $0 }
     NR==11{ print $0, hold  }
     NR >11
    ' file

В один вкладыш:

$ seq 15 | awk 'NR<11{hold=hold RS $0}NR==11{print $0,hold}NR>11'
11 
1
2
3
4
5
6
7
8
9
10
12
13
14
15
0
28.04.2021, 23:22

Теги

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