shell - sheet - unix指令




我怎樣才能扭轉文件中的行的順序? (12)

BSD尾巴:

tail -r myfile.txt

參考: FreeBSDNetBSDOpenBSDOS X手冊頁。

我想倒轉文本文件(或標準輸入)中行的順序,保留每行的內容。

所以,即從以下開始:

foo
bar
baz

我想結束

baz
bar
foo

有沒有一個標準的UNIX命令行工具?


編輯以下內容會生成從1到10的隨機排序數字列表:

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

點用實際的命令代替,其反轉列表

TAC

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

python:在sys.stdin上使用[:: - 1]

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]))")

另外值得一提的是: tac (the,ahem,反向的cat )。 部分coreutils

將一個文件翻轉成另一個文件

tac a.txt > b.txt

只是Bash :)(4.0+)

function print_reversed {
    readarray -t LINES
    for (( I = ${#LINES[@]}; I; )); do
        printf '%s\n' "${LINES[--I]}"
    done
}

print_reversed < file

如果你碰巧在vim使用

:g/^/m0

對於可能在shell腳本中使用tac跨操作系統(即OSX,Linux)解決方案,使用上面提到的其他自製軟件,然後就像tac一樣使用tac:

brew install coreutils
echo "alias tac='gtac'" >> ~/.bash_aliases (or wherever you load aliases)
source ~/.bash_aliases
tac myfile.txt

我真的很喜歡“ tail -r ”的回答,但是我最喜歡的gawk答案是......

gawk '{ L[n++] = $0 } 
  END { while(n--) 
        print L[n] }' file

最佳方案:

tail -n20 file.txt | tac

一些眾所周知的sed技巧

# 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 ...


這對BSD和GNU都有效。

awk '{arr[i++]=$0} END {while (i>0) print arr[--i] }' filename

sort -r < filename

要么

rev < filename

tac <file_name>

例:

$ cat file1.txt
1
2
3
4
5

$ tac file1.txt
5
4
3
2
1




command-line