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,等價於 /.*/

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM