我有一個檔案,其中包含空格分隔的欄位及其值。我想根據欄位的字母順序對這個檔案進行排序。
v_party_id="49529957" v_party_default_status_cd="NOTDFLT" v_src_system_id="VTX" v_pd_percent="0.0127" d_report_ref_date="2021-03-31" v_accounting_standard="IFRS"
v_party_id="49530058" v_party_default_status_cd="NOTDFLT" v_src_system_id="VTX" v_pd_percent="0.00285" d_report_ref_date="2021-03-31" v_accounting_standard="IFRS"
在所有欄位按欄位名稱(而不是值)按字母順序排序之后。預期產出是-
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_id="49529957" v_party_default_status_cd="NOTDFLT" v_src_system_id="VTX" v_pd_percent="0.0127"
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_id="49530058" v_party_default_status_cd="NOTDFLT" v_src_system_id="VTX" v_pd_percent="0.00285"
我正在嘗試通過 bash-
filecontent=( `cat "file1" `)
for t in "${filecontent[@]}"
do
echo $t
done|sort
這給了我輸出 -
d_report_ref_date="2021-03-31"
d_report_ref_date="2021-03-31"
v_accounting_standard="IFRS"
v_accounting_standard="IFRS"
v_party_default_status_cd="NOTDFLT"
v_party_default_status_cd="NOTDFLT"
v_party_id="49529957"
v_party_id="49530058"
v_pd_percent="0.00285"
v_pd_percent="0.0127"
v_src_system_id="VTX"
v_src_system_id="VTX"
如何獲得所需的輸出,它只有兩行帶有排序的欄位名?
提前致謝!!!
uj5u.com熱心網友回復:
perl 將是對欄位進行排序的不錯選擇:
perl -lane 'print "@{[sort @F]}"' file.txt
輸出:
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_default_status_cd="NOTDFLT" v_party_id="49529957" v_pd_percent="0.0127" v_src_system_id="VTX"
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_default_status_cd="NOTDFLT" v_party_id="49530058" v_pd_percent="0.00285" v_src_system_id="VTX"
uj5u.com熱心網友回復:
假設值中沒有空格,您應該能夠使用以下內容:
# read a file line by line and split on spaces into an array
while IFS=' ' read -r -a elements; do
# output array elements on separate lines, sort them and join with spaces
printf "%s\n" "${elements[@]}" | sort | paste -sd' '
done < inputfile.txt
如果"... ..."您之間有空格,則必須撰寫自己的決議器來標記該行。
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk命令。用 GNU 撰寫和測驗awk。
awk '
BEGIN {PROCINFO["sorted_in"] = "@val_str_asc"}
{
split($0,a)
j=0
for (i in a){
printf "%s", a[i] ( j<NF ? OFS : ORS)
}
}' Input_file
uj5u.com熱心網友回復:
你已經得到了一個很好的 GNU awk 解決方案,但是如果你沒有 GNU awk,那么在每個 Unix 機器上的任何 shell 中使用任何 awk sort 并帶有裝飾/排序/不裝飾習語:
$ awk '{for (i=1; i<=NF; i ) print NR, NF, $i}' file |
sort -k1,1n -k3,3 |
awk '{rec=rec sep $3; sep=OFS} cnt==$2{print rec; rec=sep=cnt=""}'
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_default_status_cd="NOTDFLT" v_party_id="49529957" v_pd_percent="0.0127" v_src_system_id="VTX"
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_default_status_cd="NOTDFLT" v_party_id="49530058" v_pd_percent="0.00285" v_src_system_id="VTX"
uj5u.com熱心網友回復:
您可以使用此gnu-awk解決方案:
awk '
BEGIN {PROCINFO["sorted_in"] = "@val_str_asc"}
{
for (i=1; i<=NF; i)
a[i] = $i
j = 0
for (i in a)
printf "%s", a[i] ( j<NF ? OFS : ORS)
}' file
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_default_status_cd="NOTDFLT" v_party_id="49529957" v_pd_percent="0.0127" v_src_system_id="VTX"
d_report_ref_date="2021-03-31" v_accounting_standard="IFRS" v_party_default_status_cd="NOTDFLT" v_party_id="49530058" v_pd_percent="0.00285" v_src_system_id="VTX"
作業在線演示
細節:
PROCINFO["sorted_in"] = "@val_str_asc"按字串升序對具有值的陣列進行排序- 第一個 for 回圈將每個欄位存盤在陣列中
a,鍵作為欄位位置 abd 值作為欄位值 - 由于
PROCINFO陣列的存在將按字母值順序排序 - 第二個 for 回圈列印每個排序的條目
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409669.html
標籤:
