LINUX.ORG.RU

Первое, что пришло в голову:

$ perl -ne 'push @x,$_;if($. % 3==0){print $x[0],$x[2],$x[1];@x=()}END{print for @x}' file.txt 

Наверняка можно красивее.

evbogdanov
()
Ответ на: комментарий от evbogdanov

Спасибо, работает! Но тоже уважаю максимально красивые и минималистичные решения.

vovin2002
() автор топика
for i in $(seq 1 8) ; do echo $i >> data.txt; done

cat data.txt  | awk '{getline two;getline three; print $0; print three; print two; three=two=""}'
1
3
2
4
6
5
7

8
anonymous
()

cat in.txt | head -n 1 >> out.txt; cat in.txt | tail -n +2 | head -n 2 | tac >> out.txt; cat in.txt | tail -n +4 >> out.txt

:)

vaddd ★☆
()
Ответ на: комментарий от anonymous
cat x.txt | perl -e 'print((map scalar <>, 1..3)[0,2,1]) until eof'

Самое читабельное наверное, из того, что попробовал.

anonymous
()

А чего на sed-е то никто не может чтоли? Оно ведь просто и красиво:

sed -e '1~3b;2~3{h;d};3~3G'

vodz ★★★★★
()
Ответ на: комментарий от vovin2002

Решение на sed прекрасно. Жаль только, не везде работает (на Маке, например, выдаёт ошибку).

Такой ещё вариант:

perl -ne '$x=<>;$y=<>;print$_,$y,$x'

evbogdanov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.