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

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

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

foo
bar
baz

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

baz
bar
foo

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

Ответы [ 21 ]

1253 голосов
/ 13 апреля 2009

Также стоит упомянуть: tac (гм, реверс cat). Часть coreutils .

Переключение одного файла в другой

tac a.txt > b.txt
397 голосов
/ 13 апреля 2009

BSD хвост:

tail -r myfile.txt

Ссылка: FreeBSD , NetBSD , OpenBSD и OS X справочные страницы.

147 голосов
/ 13 апреля 2009

Это известные трюки с седом :

# reverse order of lines (emulates "tac")
# bug/feature in HHsed v1.5 causes blank lines to be deleted
sed '1!G;h;$!d'               # method 1
sed -n '1!G;h;$p'             # method 2

(Пояснение: добавьте не начальную строку для хранения буфера, поменяйте местами строку и удерживайте буфер, распечатайте строку в конце)

В качестве альтернативы (с более быстрым исполнением) из однострочников awk :

awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file*

Если вы не можете вспомнить это,

perl -e 'print reverse <>'

В системе с утилитами GNU другие ответы проще, но не во всем мире GNU / Linux ...

53 голосов
/ 29 ноября 2011

Если вы оказались в vim, используйте

:g/^/m0
39 голосов
/ 14 декабря 2012
$ (tac 2> /dev/null || tail -r)

Попробуйте tac, который работает в Linux, и если это не работает, используйте tail -r, который работает в BSD и OSX.

37 голосов
/ 20 июля 2017
tac <file_name>

пример:

$ cat file1.txt
1
2
3
4
5

$ tac file1.txt
5
4
3
2
1
28 голосов
/ 08 августа 2018

в конце вашей команды поставьте: | tac

tac делает именно то, что вы просите, он записывает каждый ФАЙЛ в стандартный вывод, сначала в последнюю строку.

tac является противоположностью cat: -).

24 голосов
/ 06 мая 2009

Попробуйте следующую команду:

grep -n "" myfile.txt | sort -r -n | gawk -F : "{ print $2 }"
15 голосов
/ 15 сентября 2013

Just Bash :) (4.0 +)

function print_reversed {
    local lines i
    readarray -t lines

    for (( i = ${#lines[@]}; i--; )); do
        printf '%s\n' "${lines[i]}"
    done
}

print_reversed < file
11 голосов
/ 20 января 2015

Самый простой способ - использовать команду tac. tac является обратным cat. Пример:

$ cat order.txt
roger shah 
armin van buuren
fpga vhdl arduino c++ java gridgain
$ tac order.txt > inverted_file.txt
$ cat inverted_file.txt
fpga vhdl arduino c++ java gridgain
armin van buuren
roger shah 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...