㈠ linux:cut、sort都是針對列操作,有沒有對行操作的命令
sort命令用於對文檔內容進行排序處理,命令使用格式如下:
sort 選項 文件1 文件2 ......
sort命令的常用選項包括:
-t 指定分割文本的分隔符
-k 指定按照分割後文本內容的第幾列排序
-r 結果降序排序
-n 把文本轉換為數值再排序
使用sort命令的示例如下:
①sort -rn -k 2 f1:按照文檔第二列的數值大小進行降序排序。-n表示按照數值大小比較排序,默認為升序,加上-r表示為降序,-k指定按照第幾列排序。
②sort -rn -u -k 2 f1:-u表示去除重復行。
③sort -t ":" -rn -k 2 f1:-t指定列之間的分隔符為「:」,不寫則默認空格作為分隔符。
cut命令用於顯示按照分隔符截取分指定列的文本內容,命令使用格式如下:
cut 選項 文件1 文件2 ......
cut命令的常用選項包括:
-d 指定文本分隔符
-f 指定顯示分割後文本的第幾列
cut -d " " -f 3 f1:截取文檔中的第三列。-d指定分隔符為一個空格,-f指定顯示第幾列。但是,cut命令對分隔符連續較多的情況,審核較為死板,很難按照我們想要的效果實現截取,如有以下文件:
aaa 111 ccc
bbb 222 ccc
每行文字中各列間的空格數不同,「aaa」與「111」之間有一個空格,而「bbb」與「222」之間有兩個空格,在使用cut命令時,如果設定分隔符為一個空格,希望截取用空格隔開的文字時,對於行「bbb 222」由於文字中存在二個空格,其中的第二個空格則被視為第二列,所以cut命令不會把「222」視為第二列而是第三列。因此,cut在截取數量不確定的空格隔開的文字時十分不便。所以一般在連續分隔符個數不統一時,更習慣使用awk命令。
㈡ linuxawk數組排序多種實現方法
復制代碼代碼如下:如果需要按照順序輸出,通過鍵值定位方式輸出。
復制代碼代碼如下:一、通過內置函數(asort,asorti使用) awk 3.1以上版本才支持
1、asort使用說明
srcarrlen=asort[srcarr,dscarr] 默認返回值是:原數組長度,傳入參數dscarr則將排序後數組賦值給dscarr.
asort只對值進行了排序,因此丟掉原先鍵值。
2、asorti 使用說明
復制代碼代碼如下:asorti對鍵值 進行排序(字元串類型),將生成新的數組放入:tA中。
二、通過管道發送到sort排序
復制代碼代碼如下:通過管道,發送到外部程序「sort」排序,-r 從大到小,-n 按照數字排序,-k2 以第2列排序。通過將數據丟給第3方的sort命令,所有問題變得非常簡單。如果以key值排序 –k2 變成 -k1即可。
復制代碼代碼如下:三、自定義排序函數
awk自定義函數結構:
復制代碼代碼如下:以上是:awk自定義函數表示方式,默認傳入參數都是以引用方式傳入,return值,只能是字元型或者數值型。 不能返回數組類型。 如果返回數組類型。需要通過形參 方式傳入。再獲得。
awk返回數組類型
awk 'function test(ary){ for(i=0;i<10;i++){ ary[i]=i; } return i;}BEGIN{ n=test(array); for(i=0;i<n;i++){ print array[i]; }}'
排序函數
復制代碼代碼如下:#key 排序類型 1是按照值排序 2按照鍵值
#datatype 比較類型 1按照數字排序 2按照字元串排序
#tarr 排序返回的數組
#splitseq 分割字元串 數組中鍵與值之間分割字元串
#return 數組長度
#實現思路,將原始數組a[『a』]=100 排序後變成 a[1]=a分隔符100 ,然後按照下標遞歸顯示內容。 本排序使用冒泡方式進行。
function sortArr(arr,key,datatype,tarr,splitseq)
{
if(key ~ /[^1-2]/)
{return tarr;}
for(k in arr)
{
tarr[++alen]=(k""splitseq""arr[k]);
}
for(m=1;m<=alen;m++)
{
for(n=1;n<=alen-m-1;n++)
{
split(tarr[m],tm,splitseq);
split(tarr[n+1],tn,splitseq);
tnum=tarr[m];
if(datatype==1)
{
if(tm[key]+0<tn[key]+0)
{
tarr[m]=tarr[n+1];
tarr[n+1]=tnum;
}
}
else
{
if((tm[key]"") < (tn[key]""))
{
tarr[m]=tarr[n+1];
tarr[n+1]=tnum;
}
}
}
}
return alen;
}
完整代碼如下:
復制代碼代碼如下: if(key ~ /[^1-2]/)
{return tarr;}
for(k in arr)
{
tarr[++alen]=(k""splitseq""arr[k]);
}
for(m=1;m<=alen;m++)
{
for(n=1;n<=alen-m-1;n++)
{
split(tarr[m],tm,splitseq);
split(tarr[n+1],tn,splitseq);
tnum=tarr[m];
if(datatype==1)
{
if(tm[key]+0<tn[key]+0)
{
tarr[m]=tarr[n+1];
tarr[n+1]=tnum;
}
}
else
{
if((tm[key]"") < (tn[key]""))
{
tarr[m]=tarr[n+1];
tarr[n+1]=tnum;
}
}
}
}
return alen;
}
'
1 b 110
2 a 100
3 c 10
以上是awk數組排序一些方法。對於少量數據排序,就性能而言,使用自定義函數性能要高,不需要另外再開啟進程。對於大量數據,排序第2種方法還是很不錯的。