Рассмотрим следующую команду:
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 '/$'"
С помощью 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
С 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 ).
С 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
Питон
#!/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;