嗨,我正在嘗試這個東西,但它不起作用。

我知道它不起作用,因為當單詞用空格分隔時,每行都有不同的列數,但是我們可以以任何方式完成預期的作業。
uj5u.com熱心網友回復:
注意:假設輸入檔案的列由空格而不是制表符分隔,否則 dan 的評論 - sort -nt $'\t' -k3,3- 就足夠了
sort允許我們指定欄位終止符以及要排序的欄位(以及可選的欄位子字串)。
如果我們將欄位分隔符設定為換行符 ( \n),則整行將變為單個欄位。
從這里我們可以指定欄位 #1 的子字串作為排序依據;-k1.x,1.y表示按欄位 #1 從一個位置x到另一個位置排序y(欄位/行的第一個字符的位置為1)。
樣本輸入:
$ cat animals.txt
1 2 3 4 5 6
123456789012345678901234567890123456789012345678901234567890
alpaca Intermediate Perl 2012 Schwatz, Randal
donkey Cisco IOS in a Nutshell 2005 Boney, James
horse Linux in a Nutshell 2009 Siever, Ellen
在哪里:
- 檔案中不存在前 2 行(比例);規模向我們展示...
- 線的
year一部分從位置36到39
將所有這些都拉到一個sort電話中:
# sort numerically by year (ascending)
$ sort -t$'\n' -k1.36,1.39 -n animals.txt
donkey Cisco IOS in a Nutshell 2005 Boney, James
horse Linux in a Nutshell 2009 Siever, Ellen
alpaca Intermediate Perl 2012 Schwatz, Randal
# sort numerically by year (descending)
$ sort -t$'\n' -k1.36,1.39 -rn animals.txt
alpaca Intermediate Perl 2012 Schwatz, Randal
horse Linux in a Nutshell 2009 Siever, Ellen
donkey Cisco IOS in a Nutshell 2005 Boney, James
注意:假設所有行的year位置相同(即檔案的內容按照固定寬度方案進行格式化)
顯然這種方法需要我們year提前知道子串的位置;有幾種方法可以確定這個位置......一個想法,假設year列總是第一次出現 4 位數的子字串......使用bash正則運算式匹配和BASH_REMATCH[]陣列來確定最多 4 行的長度-數字year,例如:
$ regex="^([^0-9]*)([0-9]{4}).*"
$ [[ $(head -1 animals.txt) =~ $regex ]] && typeset -p BASH_REMATCH
declare -ar BASH_REMATCH=([0]="alpaca Intermediate Perl 2012 Schwatz, Randal" [1]="alpaca Intermediate Perl " [2]="2012")
從這里我們看到,BASH_REMATCH[1]包含了行的內容,直到year( 2012for the alpacaline); 現在我們獲取 的長度BASH_REMATCH[1]并加上 1/ 3 來得到我們的x和y值:
$ (( x = ${#BASH_REMATCH[1]} 1 ))
$ (( y = x 3 ))
$ typeset -p x y
declare -- x="36"
declare -- y="39"
將這些變數插入我們之前的sort呼叫中:
# sort numerically by year (ascending)
$ sort -t$'\n' -k1.${x},1.${y} -n animals.txt
donkey Cisco IOS in a Nutshell 2005 Boney, James
horse Linux in a Nutshell 2009 Siever, Ellen
alpaca Intermediate Perl 2012 Schwatz, Randal
# sort numerically by year (descending)
$ sort -t$'\n' -k1.${x},1.${y} -rn animals.txt
alpaca Intermediate Perl 2012 Schwatz, Randal
horse Linux in a Nutshell 2009 Siever, Ellen
donkey Cisco IOS in a Nutshell 2005 Boney, James
注意:在多行具有相同日期的情況下,OP 沒有定義二級排序要求,但擴展這個答案以包括二級(和三級?)排序要求應該不會太難
uj5u.com熱心網友回復:
嘗試添加逗號之類的分隔符,因為從那里您將能夠使用sort帶有-t引數的命令并指定給定的欄位分隔符。
要使用分隔符查找和替換字符,我會使用cat animals.txt | sed {insert the pattern}.
根據您共享的檔案,您可以嘗試在第一個單詞之后以及數值之前和之后添加分隔符。
uj5u.com熱心網友回復:
一種方法是將年份復制到每行的開頭,sed并sort以數字形式生成輸出,然后在每行的開頭洗掉年份:
sed 's/^.*[[:space:]]\([12][09][0-9][0-9]\)[[:space:]].*$/\1 &/' animals.txt \
| sort -n | sed 's/^.....//'
問題中示例的輸出animals.txt是:
oryx Writing Word Macros 1999 Roman, Steven
donkey Cisco IOS in a Nutshell 2005 Boney, James
snail SSH, The Secure Shell 2005 Barrett, Daniel
horse Linux in a Nutshell 2009 Sievers, Ellen
python Programming Python 2010 Lutz, Mark
alpaca Intermediate Perl 2012 Schwartz, Randal
robin MySQL High Availability 2014 Bell, Charles
uj5u.com熱心網友回復:
注意:假設輸入檔案的列由空格而不是制表符分隔,否則 dan 的評論 - sort -nt $'\t' -k3,3- 就足夠了
如果GNU awk可用,我們可以awk找到year子字串的索引,然后為我們對輸出進行排序。
樣本輸入:
$ cat animals.txt
1 2 3 4 5 6
123456789012345678901234567890123456789012345678901234567890
alpaca Intermediate Perl 2012 Schwatz, Randal
donkey Cisco IOS in a Nutshell 2005 Boney, James
horse Linux in a Nutshell 2009 Siever, Ellen
在哪里:
- 檔案中不存在前 2 行(比例);規模向我們展示...
- 線的
year一部分從位置36到39
一個GNU awk想法:
awk '
FNR==1 { x=match($0, /[0-9]{4}/) } # find index of the "year" substring in the 1st line of input; assumes the "year" is the 1st occurrence of a 4-digit substring
{ arr[substr($0,x,4)][FNR]=$0 } # populate 2-dimensional array using "year" and row number (FNR) as indexes
END { PROCINFO["sorted_in"]="@ind_num_asc" # sort indexes as numbers in "asc"ending order
for (i in arr)
for (j in arr[i])
print arr[i][j]
}
' animals.txt
這會產生:
donkey Cisco IOS in a Nutshell 2005 Boney, James
horse Linux in a Nutshell 2009 Siever, Ellen
alpaca Intermediate Perl 2012 Schwatz, Randal
如果我們將排序順序從 更改為@ind_num_asc,@ind_num_desc我們可以按降序生成輸出year,即:
alpaca Intermediate Perl 2012 Schwatz, Randal
horse Linux in a Nutshell 2009 Siever, Ellen
donkey Cisco IOS in a Nutshell 2005 Boney, James
筆記:
GNU awk需要多維陣列(又名陣列陣列)支持GNU awkPROCINFO["sorted_in"]該功能所需- 假設整個檔案可以放入記憶體(由于將所有行都存盤在陣列中)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/493732.html
標籤:重击
上一篇:Bash腳本在Jenkins構建期間失敗,但在本地沒有失敗
下一篇:如何在Vim的視覺選擇中洗掉單詞
