我有一個包含如下行的檔案,其中第 3 列有多個需要排序的數值:
檔案:h1.csv
S101-T1 類;3343-1-25310;3344 -1-25446 3345 -1-25691 3348 -1-27681 3347 -1-28453
S101-T2 類;3343-2-25310;3344-2-25446 3345-2-25691
S101-T1 類;3343-3- 25310; 3345 -3-25691 3343 -3-25314
S101-T2 類;3343-4-25310;3345 -4-25691 3343 -4-25314 3344 -4-25314
S102-T1 類;3343-5-25310;3344-5-25446 3345-5-25691
所以,預期的輸出是:
S101-T1 類;3343-1-25310;3344 -1-25446 3345 -1-25691 3347 -1-28453 3348 -1-27681
S101-T2 類;3343-2-25310;3344-2-25446 3345-2-25691
S101-T1 類;3343-3- 25310; 3343 -3-25314 3345 -3-25691
S101-T2 類;3343-4-25310;3343 -4-25314 3344 -4-25314 3345 -4-25691
S102-T1 級;3343-5-25310;3344-5-25446 3345-5-25691
我的想法是用 awk 捕獲第三列并對其進行排序,最后列印輸出,但我只是為了捕獲該列。我沒有成功對其進行排序,也沒有列印出不想要的輸出。
這是我到目前為止的代碼......
cat h1.csv | awk -F';' '{ gsub(" ","\n",$3); print $0 }'
我已經嘗試過(還有一些人給出了錯誤):
cat h1.csv | awk -F';' '{ gsub(" ","\n",$3); print $3 | "sort -u" }'
cat h1.csv | awk -F';' '{ gsub(" ","\n",$3); sort -u; print $3 }'
那么,是否有可能這樣做,如何?,任何幫助!謝謝...
uj5u.com熱心網友回復:
一種選擇可能是將第三列拆分為空格,然后對值進行排序。
然后再次連接前 2 個欄位以及拆分和排序的欄位。
awk '
BEGIN{FS=OFS=";"}
{
n=split($3, a, " ")
asort(a)
res = $1 OFS $2 OFS
for (i = 1; i <= n; i ) {
res = res " " a[i]
}
print res
}' file
輸出
Class S101-T1;3343-1-25310; 3344-1-25446 3345-1-25691 3347-1-28453 3348-1-27681
Class S101-T2;3343-2-25310; 3344-2-25446 3345-2-25691
Class S101-T1;3343-3-25310; 3343-3-25314 3345-3-25691
Class S101-T2;3343-4-25310; 3343-4-25314 3344-4-25314 3345-4-25691
Class S102-T1;3343-5-25310; 3344-5-25446 3345-5-25691
uj5u.com熱心網友回復:
在 GNU 中awk,使用您顯示的示例,請嘗試以下awk代碼。
awk '
BEGIN{
FS=OFS=";"
PROCINFO["sorted_in"] = "@val_num_asc"
}
{
nf=val=""
delete value
num=split($NF,arr," ")
for(i=1;i<=num;i ){
split(arr[i],arr2,"-")
value[arr2[1]]=arr[i]
}
for(i in value){
nf=(nf?nf " ":"")value[i]
}
$NF=nf
}
1
' Input_file
說明:為上述添加詳細說明。
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section from here.
FS=OFS=";" ##Setting FS, OFS as ; here.
PROCINFO["sorted_in"] = "@val_num_asc" ##Setting PROCINFO using sorted_in to make sure array values are sorted by values in ascending order only.
}
{
nf=val="" ##Nullifying variables here.
delete value ##Deleting value array here.
num=split($NF,arr," ") ##Splitting last field into arr with separator as space here.
for(i=1;i<=num;i ){ ##Traversing through all elements of array arr.
split(arr[i],arr2,"-") ##Splitting first value of arr into arr2 by delimiter of - to make sure to get only first value eg: 3344, 3345 etc.
value[arr2[1]]=arr[i] ##Assigning value array value to arr value with index of arr2 value whose index of 1st.
}
for(i in value){ ##Traversing through array value here.
nf=(nf?nf " ":"")value[i] ##Concatenating all values to nf here.
}
$NF=nf ##Assigning last field value to nf here.
}
1 ##printing edited/non-edited line here.
' Input_file ##Mentioning Input_file name here.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407702.html
標籤:
