我想在 Unix 中對檔案進行排序,為此我正在使用命令
sort file --field-separator=' ' --key=7,7
但是這個欄位的位置不是固定的,有時可以是第7個欄位,有時也可以是第6個或第8個欄位。
我們是否知道是否可以根據欄位名稱對檔案進行排序,例如
sort file --field-separator=' ' --keyname=<my_unique_id>
檔案看起來像這樣,我想根據 party_id
status_date="2000-01-31" ref_date="2021-03-31" ead_percent="0.00365316" accounting_standard="IFRS" party_default_status_cd="NOTDFLT" party_id="36113477" v_src_system_id="ABC"
status_date="2002-12-31" ref_date="2021-03-31" ead_percent="1" accounting_standard="IFRS" orig_src_system_id="GRD" party_default_status_cd="UNLIKE" party_id="36053415" v_src_system_id="XYZ"
uj5u.com熱心網友回復:
sort沒有命名鍵的概念,但您可以執行Schwartzian 變換以臨時將鍵作為前綴添加到行中,對第一個欄位進行排序,然后丟棄它。
sed 's/\(.*\)\(party_id="[^"]*"\)/\2 \1\2/' file |
sort -t ' ' -k1,1 |
cut -f2-
(其中兩個第一個反向參考之間和sort -t引數中的空格是文字制表符,但是 Stack Overflow 將其呈現為一系列空格)。
uj5u.com熱心網友回復:
使用 Decorate/Sort/Undecorate 習語并假設,就像您提供的示例一樣,您參考的字串不包含空格=、 或":
裝飾:
$ awk -F'[ ="] ' -v OFS='\t' -v keyname='party_id' '{for (i=1; i<NF; i =2) if ($i == keyname) { print $(i 1), $0; next} }' file
36113477 status_date="2000-01-31" ref_date="2021-03-31" ead_percent="0.00365316" accounting_standard="IFRS" party_default_status_cd="NOTDFLT" party_id="36113477" v_src_system_id="ABC"
36053415 status_date="2002-12-31" ref_date="2021-03-31" ead_percent="1" accounting_standard="IFRS" orig_src_system_id="GRD" party_default_status_cd="UNLIKE" party_id="36053415" v_src_system_id="XYZ"
裝飾然后排序:
$ awk -F'[ ="] ' -v OFS='\t' -v keyname='party_id' '{for (i=1; i<NF; i =2) if ($i == keyname) { print $(i 1), $0; next} }' file |
sort -k1,1n
36053415 status_date="2002-12-31" ref_date="2021-03-31" ead_percent="1" accounting_standard="IFRS" orig_src_system_id="GRD" party_default_status_cd="UNLIKE" party_id="36053415" v_src_system_id="XYZ"
36113477 status_date="2000-01-31" ref_date="2021-03-31" ead_percent="0.00365316" accounting_standard="IFRS" party_default_status_cd="NOTDFLT" party_id="36113477" v_src_system_id="ABC"
裝飾然后排序然后取消裝飾:
$ awk -F'[ ="] ' -v OFS='\t' -v keyname='party_id' '{for (i=1; i<NF; i =2) if ($i == keyname) { print $(i 1), $0; next} }' file |
sort -k1,1n |
cut -f2-
status_date="2002-12-31" ref_date="2021-03-31" ead_percent="1" accounting_standard="IFRS" orig_src_system_id="GRD" party_default_status_cd="UNLIKE" party_id="36053415" v_src_system_id="XYZ"
status_date="2000-01-31" ref_date="2021-03-31" ead_percent="0.00365316" accounting_standard="IFRS" party_default_status_cd="NOTDFLT" party_id="36113477" v_src_system_id="ABC"
uj5u.com熱心網友回復:
使用GNU awk( gawk) 可以指定如何遍歷陣列。下面將每一行保存在一個陣列中,party_id=XYZ作為各自的索引,然后回傳按所述索引排序的陣列。對于非常大的檔案,受 RAM 限制。
awk '{match($0,/party_id=[^ ]*/,$0,id) ; arr[id[0]]=$0}
END {PROCINFO["sorted_in"]="@ind_str_asc"
for (i in arr) {print arr[i]}
}' infile.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409665.html
標籤:
