awk打印第n個參數到最後一個技巧/將n行組成一列

打印第n參數到最後一個參數

  • 文本的NF不等,即字段長度不固定,想截取從$3到$NF
  1. 第一反應是使用循環
[root@localhost ~]# echo "1 2 3 4 5" | awk '{for(i=1;i<3;i++)$i="";print}'
  3 4 5
  1. 但其實能夠使用CU帽神給的技巧
[root@localhost ~]#echo "1 2 3 4 5" | awk '{$1=$2="";print}'
  3 4 5
  1. 若是分隔符比較標準的話(即便用的是統一的標準分隔符),建議仍是用cut命令比較嗨皮
[root@jizhong Fri Aug 18 14:05:26 ~]# echo "1 2 3 4 5" | cut -d" " -f3-
3 4 5
  1. 帽子神寫的從第三個到最後一個
[root@jizhong Fri Aug 18 14:06:47 ~]# echo "1 2 3 4 5" | awk '{$1=$2=""}1'
  3 4 5
其實第2種跟第4種是同樣的,只是換用了一些技巧,省略print而已;總的來講,遇到這類狀況使用cut會更好一點;使用cut會少去第一個空格,由於awk的默認分隔符爲空格

將多行文本內容合併爲一行

  • 遇到一個4500行的文本,每行文本只有一段字符串且沒有分隔符,現再想要將這個文本進行重組,每50行以逗號爲分隔符合成一行
文本內容格式以下
MD_Q9_G1_F
MD_Q9_G1_Ua
MD_Q9_G1_Ub
MD_Q9_G1_Uc
MD_Q9_G1_Uab
MD_Q9_G1_Ubc
MD_Q9_G1_Uca
MD_Q9_G1_Ia
MD_Q9_G1_Ib
MD_Q9_G1_Ic
MD_Q9_G1_Pa
MD_Q9_G1_Pb
MD_Q9_G1_Pc
MD_Q9_G1_Psum
MD_Q9_G1_Qa
MD_Q9_G1_Qb
MD_Q9_G1_Qc
MD_Q9_G1_Qsum
MD_Q9_G1_Sa
MD_Q9_G1_Sb
MD_Q9_G1_Sc
MD_Q9_G1_Ssum
MD_Q9_G1_PFa
MD_Q9_G1_PFb
MD_Q9_G1_PFc
MD_Q9_G1_PF
  1. 思路:分隔符對50取餘,餘數爲0時,OFS=\n,不然OFS=,
awk '{ORS=NR%50?",":RS}1'
  1. 還有就是使用paste
可是,paste只有將多行合併爲一行,但並無分割的功能
要是有,但願大神指點
  1. 一樣是對NR取餘,但利用printf與print的換行區別來實現需求
awk 'NR%50{printf $0",";next}1'   
當NR取餘非零時,執行{printf $0",";next},並跳過1(1表示print)
當NR取餘爲零時,執行1({print $0})print默認換行
  1. 一樣是對NR判斷,但使用的額是三目運算符
awk '{OFS=",";ORS=NR%50?OFS:RS}1'
知足條件時,輸出爲OFS(即,)
不然使用RS爲輸出符

pattern省略或爲1,等價於 /.*/shell

action省略,等價於 { print $0 }code

awk將變量傳給shell能夠用eval, 如 eval $(awk 'BEGIN{print "a=ggg b=3"}')則shell變量$a就是ggg,shell變量$b就是3字符串

相關文章
相關標籤/搜索