在日常文本的處理中撵枢,我們經(jīng)常會(huì)碰見行列轉(zhuǎn)換的情況雷恃,以下為幾種常見的行列轉(zhuǎn)換命令:
方案一
基本思路:將所有內(nèi)容存儲(chǔ)到一個(gè)二維數(shù)組中,之后按列輸出每一行
cat file.txt | awk 'BEGIN{c=0;} {for(i=1;i<=NF;i++) {num[c,i] = $i;} c++;} END{ for(i=1;i<=NF;i++){str=""; for(j=0;j<NR;j++){ if(j>0){str = str" "} str= str""num[j,i]}printf("%s\n", str)} }'
如果想使用tab鍵分開:
cat file.txt | awk 'BEGIN{c=0;} {for(i=1;i<=NF;i++) {num[c,i] = $i;} c++;} END{ for(i=1;i<=NF;i++){str=""; for(j=0;j<NR;j++){ if(j>0){str = str" "} str= str"\t"num[j,i]}printf("%s\n", str)} }'
另一種寫法
cat file.txt | awk '{for(i=1;i<=NF;i=i+1){a[NR,i]=$i}}END{for(j=1;j<=NF;j++){str=a[1,j];for(i=2;i<=NR;i++){str=str " " a[i,j]}print str}}'
方案二
使用一維數(shù)組牺六,記錄每一列的組合串键闺;當(dāng)是第一行時(shí)賦值,否則都是累加,即字符串拼接
cat file.txt | awk '{ for(i=1;i<=NF;i++){ if(NR==1){ arr[i]=$i; }else{ arr[i]=arr[i]" "$i; } } } END{ for(i=1;i<=NF;i++){ print arr[i]; } }'
同樣走搁,tab鍵分割:
cat file.txt | awk '{ for(i=1;i<=NF;i++){ if(NR==1){ arr[i]=$i; }else{ arr[i]=arr[i]"\t"$i; } } } END{ for(i=1;i<=NF;i++){ print arr[i]; } }'
awk參數(shù)解析
NR - Number of Record :當(dāng)前處理的行是第幾行(因?yàn)閍wk是流處理工具独柑,一行一行處理的,所以NR在不停的自增1)私植;END里面引用的NR忌栅,是處理完文本后的NR
FNR - File Number of Record :當(dāng)前處理的行是當(dāng)前處理文件的第幾行
NF - Number of Fileds:當(dāng)前行有多少列數(shù)據(jù)(這個(gè)在每行都會(huì)根據(jù)設(shè)定的分割符重新計(jì)算,默認(rèn)分割符是任意連續(xù)的多個(gè)空白符)
實(shí)例解析
文件: expression_mRNA_17-Aug-2014.txt
$cat expression_mRNA_17-Aug-2014.txt* | sed -n '1,10p' | cut -f 1-10 | en
1 tissue sscortex sscortex sscortex sscortex sscortex sscortex sscortex ca1hippocampus
2 group # 1 1 1 1 1 1 1 1
3 total mRNA mol 21580 21748 31642 32916 21531 24799 31406 20389
4 well 11 95 33 42 48 13 50 66
5 sex 1 -1 -1 1 1 -1 1 -1
6 age 21 20 20 21 25 20 25 23
7 diameter 0 9.56 11.1 11.7 11 11.9 11.3 10.9
8 (none) cell_id 1772071015_C02 1772071017_G12 1772071017_A05 1772071014_B06 1772067065_H06 1772071017_E02 1772067065_B07 1772067060_B09
9 (none) level1class interneurons interneurons interneurons interneurons interneurons interneurons interneurons interneurons
10 (none) level2class Int10 Int10 Int6 Int10 Int9 Int9 Int10 Int9
$cat expression_mRNA_17-Aug-2014.txt* | sed -n '1,10p' | cut -f 1-10 | cut -f 2- | awk '{ for(i=1;i<=NF;i++){ if(NR==1){ arr[i]=$i; }else{ arr[i]=arr[i]"\t"$i; } } } END{ for(i=1;i<=NF;i++){ print arr[i]; } }' | en
1 tissue group total well sex age diameter cell_id level1class level2class
2 sscortex # mRNA 11 1 21 0 1772071015_C02 interneurons Int10
3 sscortex 1 mol 95 -1 20 9.56 1772071017_G12 interneurons Int10
4 sscortex 1 21580 33 -1 20 11.1 1772071017_A05 interneurons Int6
5 sscortex 1 21748 42 1 21 11.7 1772071014_B06 interneurons Int10
6 sscortex 1 31642 48 1 25 11 1772067065_H06 interneurons Int9
7 sscortex 1 32916 13 -1 20 11.9 1772071017_E02 interneurons Int9
8 sscortex 1 21531 50 1 25 11.3 1772067065_B07 interneurons Int10
9 ca1hippocampus 1 24799 66 -1 23 10.9 1772067060_B09 interneurons Int9