Разделите строку, а затем переставьте ее

Рассмотрим следующую команду:

tree -ifF /usr/java/default/jre/lib/images | grep -v '/$'

/usr/java/default/jre/lib/images
/usr/java/default/jre/lib/images/cursors/cursors.properties
/usr/java/default/jre/lib/images/cursors/invalid32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_CopyDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_CopyNoDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_LinkDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_LinkNoDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_MoveDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_MoveNoDrop32x32.gif
/usr/java/default/jre/lib/images/icons/sun-java_HighContrastInverse.png
/usr/java/default/jre/lib/images/icons/sun-java_HighContrast.png
/usr/java/default/jre/lib/images/icons/sun-java_LowContrast.png
/usr/java/default/jre/lib/images/icons/sun-java.png

2 directories, 12 files

Аргументы -iи -fзаставляют treeвыводить полные пути в каждой строке, а не отступы. Аргумент -Fзаставляет его добавлять /к именам каталогов, которые отфильтровываются инвертированным grep(grep -v '/$').

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

watch exec "tree -ifFsD /var/local/myapp/data | grep -v '/$'"

2
27.07.2020, 18:38
4 ответа

С помощью perlвы также можете:

perl -F';' -lape '$_ = join ";", @F[0..3,5..7,4,8..10]' sample

Или для вашего фактического ввода:

perl -F'[|]' -lape '$_ = join "|", @F[0..136,138..142,137,143..161]' input
2
18.03.2021, 23:16

С Awk

awk 'BEGIN{FS=OFS=";"}{$8=$8 FS $5;$5=RS;sub(RS FS,"");print}' sample.txt > req_op.txt

Распакованный вариант, с комментариями:

awk '
  BEGIN{FS=OFS=";"} #Sets input (FS) and output (OFS) field separators
  {                 #For each line
    $8=$8 FS $5     #Append the 5th field after the 8th field
    $5=RS           #Put a newline (the record separator) in the 5th field
    sub(RS FS,"")   #Remove the newline and its following FS
    print           #Print the resulting line
  }     
' sample.txt > req_op.txt

Почему в вашем случае был выбран разделитель записей (, новая строка )для временной замены 5-го поля? Потому что это единственный персонаж, которого точно не будет в записи. Затем sub(RS FS,"")обязательно удалит 5-е поле, даже если где-то есть пустое поле.

Если вы не понимаете строку sub, удалите ее и посмотрите, что произойдет с выводом.

С Сэдом

  • С расширенным регулярным выражением:

    sed -E 's|(([^;]*;){4})([^;]*;)(([^;]*;){3})|\1\4\3|' sample.txt > req_op.txt
    
  • С базовым регулярным выражением, совместимым с POSIX, это в основном то же самое, что и выше, но каждый (){}должен быть экранирован (вздохом!):

    sed 's|\(\([^;]*;\)\{4\}\)\([^;]*;\)\(\([^;]*;\)\{3\}\)|\1\4\3|' sample.txt > req_op.txt
    

s— это команда замены sed. Следующий за ним символ — это разделитель (, который я выбрал|). Он разграничивает слот регулярного выражения, слот замены и слот флагов (, который в данном случае пуст ).

Объяснение некоторых элементов регулярного выражения:

  • [^;]*;:Ноль или более вхождений любого символа, кроме точки с запятой, за которой следует точка с запятой.
  • ([^;]*;){4}:Приведенное выше выражение находится в группе захвата и должно повторяться ровно 4 раза.
  • (([^;]*;){4}):Приведенное выше выражение находится во внешней группе захвата и воспроизводится \1в заменяющем выражении; Внутренняя группа захвата будет заменена на \2.

Итак, в первой строке 1;2;3;4;8;5;6;7;9;10;11;происходит

  • \1получает1;2;3;4;
  • \3получает8;
  • \4получает5;6;7;

и они переупорядочены как \1\4\3.

Для получения дополнительной информации о ссылках на обратную сторону -см. Использование \1 для сохранения части шаблона (эта веб-страница, кстати, является хорошим учебным пособием по SED ).

6
18.03.2021, 23:16

С Perl:

$ perl -F';' -lne 'splice @F, 7, 0, (splice @F, 4, 1); print join ";", @F' sample.txt 
1;2;3;4;5;6;7;8;9;10;11
11;12;13;14;15;16;17;18;19;20;21

См., например, Объединение массивов в срезы и нарезки в Perl

6
18.03.2021, 23:16

Питон

#!/usr/bin/python
k=open('filename','r')
r=[]
v=[]
for i in k:
    r=[]
    v=[]
    j=i.strip().split(";")
    for g in j:
        if (g != ''):
            r.append(int(g.strip()))
    r.sort()
    e=r
    for d in e:
        v.append(str(d))
        v.append(str(";"))
    print "".join(v)

выход

1;2;3;4;5;6;7;8;9;10;11;
11;12;13;14;15;16;17;18;19;20;21;
0
18.03.2021, 23:16

Теги

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