Как я могу изменить порядок строк в файле? - PullRequest
558 голосов
/ 13 апреля 2009

Я хотел бы изменить порядок строк в текстовом файле (или стандартном вводе), сохранив содержимое каждой строки.

Итак, начиная с:

foo
bar
baz

Я бы хотел закончить с

baz
bar
foo

Существует ли для этого стандартная утилита командной строки UNIX?

Ответы [ 21 ]

9 голосов
/ 08 октября 2012

Мне действительно нравится ответ " tail -r ", но мой любимый ответ gawk - ....

gawk '{ L[n++] = $0 } 
  END { while(n--) 
        print L[n] }' file
2 голосов
/ 28 марта 2017

Для кросс-ОС (то есть OSX, Linux) решения, которые могут использовать tac внутри сценария оболочки, используйте homebrew, как уже упоминалось выше, затем просто псевдоним tac, например:

brew install coreutils
echo "alias tac='gtac'" >> ~/.bash_aliases (or wherever you load aliases)
source ~/.bash_aliases
tac myfile.txt
2 голосов
/ 06 февраля 2013

EDIT следующее генерирует случайный список чисел от 1 до 10:

seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') **...**

где точки заменены фактической командой, которая переворачивает список

нолики

seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \
<(tac)

python: использование [:: - 1] для sys.stdin

seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \
<(python -c "import sys; print(''.join(([line for line in sys.stdin])[::-1]))")
2 голосов
/ 21 января 2018

Это будет работать как на BSD, так и на GNU.

awk '{arr[i++]=$0} END {while (i>0) print arr[--i] }' filename
1 голос
/ 01 декабря 2016

Лучшее решение:

tail -n20 file.txt | tac
1 голос
/ 14 марта 2019

Если вы хотите изменить файл на месте, вы можете запустить

sed -i '1!G;h;$!d' filename

Это избавляет от необходимости создавать временный файл, а затем удалять или переименовывать оригинал и дает тот же результат. Например:

$tac file > file2
$sed -i '1!G;h;$!d' file
$diff file file2
$

На основании ответа от ephemient , который сделал почти, но не совсем, то, что я хотел.

0 голосов
/ 19 апреля 2016

У меня был тот же вопрос, но я также хотел, чтобы первая строка (заголовок) оставалась сверху. Поэтому мне нужно было использовать силу awk

cat dax-weekly.csv | awk '1 { last = NR; line[last] = $0; } END { print line[1]; for (i = last; i > 1; i--) { print line[i]; } }'

PS также работает в cygwin или gitbash

0 голосов
/ 24 февраля 2019

Для пользователей Emacs: C-x h (выберите весь файл) и затем M-x reverse-region. Также работает только для выбора частей или линий и их возврата.

0 голосов
/ 16 июня 2018

tail -r работает в большинстве систем Linux и MacOS

сек. 1 20 | хвост -r

0 голосов
/ 22 апреля 2016
sort -r < filename

или

rev < filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...