2016-09-21 42 views
0
NAME 10/01 09/02 09/07 09/08 09/09 09/10 09/11 09/12 09/13 09/14 09/15 09/16 09/17 09/18 09/19 10/01 
CNMPMT_DATA 99.22  99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 
DATA01 9.79 10.75 13.67 7.97 15.22 15.1 14.63 15.71 15.56 15.37 16.69 17.33 17.06 16.5 18.01 99.22 
DATATBLS4PEAS 9.21 7.45 51.77 8.26 54.56 54.43 50.68 42.2 38.23 53.47 51.02 49.53 48.01 46.58 46.34 99.22 
EDD_DATA  57.79 57.71 58.46 57.58 57.93 59.09 58.88 58.88 58.83 58.79 58.77 58.73 58.7 59.69 59.34 99.22 
EDD_INDX  23.34 23.44 22.96 23.27 23.07 22.94 22.79 22.94 23.06 23.03 23.13 23.25 23.08 22.81 23.05 99.22 
INDX01 8.59 8.74 8.68 8.72 8.94 8.71 8.46 8.78 8.87 8.82 9.19 9.41 9.21 8.86 9.38 99.22 
SYSAUX 96.65 96.67 96.62 96.92 96.55 96.57 96.56 96.59 96.57 96.63 96.65 96.7 96.72 96.73 96.65 99.22 
SYSTEM 93.37 93.37 93.36 93.38 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 99.22 
TEMP 97.43 98.50 98.54 88.77 99.54 95.68 99.54 99.52 99.25 99.35 96.44 98.87 98.53 98.54 98.13 99.22 
TEMP_EDDDATA 96.58 96.58 96.58 96.58 96.58 96.58 96.58 96.55 96.55 96.55 96.55 96.54 96.37 96.37 96.38 99.22 
UNDOTBS1  22.35 14.31 34.18 30.17 5.37 8.94 17.08 17.43 14.7 22.96 11.99 7.83 .02  8.07 3.67 99.22 
UNDOTBS2  42.45 47.22 53.84 43.96 25.77 36.5 40.05 28.89 27.75 26.86 23.4 22.86 .02  .03  6.56 99.22 
UNDOTBS3  68.65 72.3 39.89 28.95 44.52 69.05 71.89 52.23 48.23 41.67 31.52 30.09 16.98 23.44 18.54 99.22 
USERS 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 99.22 

此文件我只想要9月份的列。文件是製表符分隔的。 試過它的工作之下,但它改變了列位置在頁眉中打印圖案並打印整列

awk 'NR==1{for(i=1; i<=NF; i++) if ($i ~"09") {a[i]++;} } { for (i in a) printf "%s\t", $i; printf "\n"}' Allen_Free.txt 


09/07 09/08 09/09 09/10 09/11 09/12 09/13 09/14 09/15 09/16 09/17 09/18 09/19 09/02 
99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 
13.67 7.97 15.22 15.1 14.63 15.71 15.56 15.37 16.69 17.33 17.06 16.5 18.01 10.75 
51.77 8.26 54.56 54.43 50.68 42.2 38.23 53.47 51.02 49.53 48.01 46.58 46.34 7.45 
58.46 57.58 57.93 59.09 58.88 58.88 58.83 58.79 58.77 58.73 58.7 59.69 59.34 57.71 
22.96 23.27 23.07 22.94 22.79 22.94 23.06 23.03 23.13 23.25 23.08 22.81 23.05 23.44 
8.68 8.72 8.94 8.71 8.46 8.78 8.87 8.82 9.19 9.41 9.21 8.86 9.38 8.74 
96.62 96.92 96.55 96.57 96.56 96.59 96.57 96.63 96.65 96.7 96.72 96.73 96.65 96.67 
93.36 93.38 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.37 
98.54 88.77 99.54 95.68 99.54 99.52 99.25 99.35 96.44 98.87 98.53 98.54 98.13 98.50 
96.58 96.58 96.58 96.58 96.58 96.55 96.55 96.55 96.55 96.54 96.37 96.37 96.38 96.58 
34.18 30.17 5.37 8.94 17.08 17.43 14.7 22.96 11.99 7.83 .02  8.07 3.67 14.31 
53.84 43.96 25.77 36.5 40.05 28.89 27.75 26.86 23.4 22.86 .02  .03  6.56 47.22 
39.89 28.95 44.52 69.05 71.89 52.23 48.23 41.67 31.52 30.09 16.98 23.44 18.54 72.3 
22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 

09/02應該是第一位的,然後09/07不知道是什麼的問題。

請幫忙。

回答

0

awk對於按行處理數據非常有用,因此您可以先轉換數據。

這是我會怎麼做:

An efficient way to transpose a file in Bash

function transpose() { 
    awk '{ 
     for (i=1; i<=NF; i++) { 
      a[NR,i] = $i 
     } 
    } 
    NF>p { p = NF } 
    END {  
     for(j=1; j<=p; j++) { 
      str=a[1,j] 
      for(i=2; i<=NR; i++){ 
       str=str" "a[i,j]; 
      } 
      print str 
     } 
    }' 
} 

然後

cat file.txt | transpose | awk 'NR==1 { print $0 } /[0-9]+\/09/ { print $0 }' | transpose 
+0

謝謝您的答覆,但功能是給刪除了(錯誤 – Neha

+0

)後轉不過它的工作其顯示第一列是姓名和09/09柱'NAME 09/09 CNMPMT_DATA 99.22 DATA01 15.22 DATATBLS4PEAS 54.56 EDD_DATA 57.93 EDD_INDX 23.07 INDX01 8.94 SYSAUX 96.55 SYSTEM 93.36 TEMP 99.54 TEMP_EDDDATA 96.58 UNDOTBS1 5.37 UNDOTBS2 25.77 UNDOTBS3 44.52 用戶22.09' – Neha

+0

這可能是因爲您沒有將這些命令輸入到bash shell中。你實際上並不需要定義一個函數,但它更好,因爲它被重用。 您可以放棄'NR == 1 {print $ 0}',它不會打印行名稱。 –

1

如果perl的解決方案是好的,

$ perl -MList::MoreUtils=indexes -nale '@i = indexes { /^09/ } @F if $. == 1; print join "\t", @F[@i]' ip.txt 
09/02 09/07 09/08 09/09 09/10 09/11 09/12 09/13 09/14 09/15 09/16 09/17 09/18 09/19 
99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 99.22 
10.75 13.67 7.97 15.22 15.1 14.63 15.71 15.56 15.37 16.69 17.33 17.06 16.5 18.01 
7.45 51.77 8.26 54.56 54.43 50.68 42.2 38.23 53.47 51.02 49.53 48.01 46.58 46.34 
57.71 58.46 57.58 57.93 59.09 58.88 58.88 58.83 58.79 58.77 58.73 58.7 59.69 59.34 
23.44 22.96 23.27 23.07 22.94 22.79 22.94 23.06 23.03 23.13 23.25 23.08 22.81 23.05 
8.74 8.68 8.72 8.94 8.71 8.46 8.78 8.87 8.82 9.19 9.41 9.21 8.86 9.38 
96.67 96.62 96.92 96.55 96.57 96.56 96.59 96.57 96.63 96.65 96.7 96.72 96.73 96.65 
93.37 93.36 93.38 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 93.36 
98.50 98.54 88.77 99.54 95.68 99.54 99.52 99.25 99.35 96.44 98.87 98.53 98.54 98.13 
96.58 96.58 96.58 96.58 96.58 96.58 96.55 96.55 96.55 96.55 96.54 96.37 96.37 96.38 
14.31 34.18 30.17 5.37 8.94 17.08 17.43 14.7 22.96 11.99 7.83 .02 8.07 3.67 
47.22 53.84 43.96 25.77 36.5 40.05 28.89 27.75 26.86 23.4 22.86 .02 .03 6.56 
72.3 39.89 28.95 44.52 69.05 71.89 52.23 48.23 41.67 31.52 30.09 16.98 23.44 18.54 
22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 22.09 
  • -MList::MoreUtils=indexes使用indexes功能從List::MoreUtils模塊
  • -ale上空間分割輸入線和保存到@F陣列,換行符在輸入線被剝離,並添加在打印
  • @i = indexes { /^09/ } @F if $. == 1如果第一線,在@F得到的所有元素的指數陣列匹配正則表達式/^09/
  • print join "\t", @F[@i]打印@F匹配的索引的元素保存在@i陣列,由製表符分隔

如果List::MoreUtils模塊不可用,

perl -nale '@i = grep { $F[$_] =~ /^09/ } 0..$#F if $. == 1; print join "\t", @F[@i]' ip.txt 
+0

謝謝Sundeep。在@INC中找不到List/MoreUtils.pm(@INC包含:和我不熟悉perl – Neha

+0

'cat text1.txt | perl -F'\ t'-nae'my($ s,$ m ,$ h,$ md,$ month)= localtime(); $ mon = sprintf(「%2.2d」,$ month + 1); print $ mon chomp @F; if(/^NAME /){@columns = @F;} for $ i(0 ..$#F){if($ i == 0 || $ columns [$ i] =〜/^$ mon /){print「\ t」if $ i!= 0;打印$ F [$ i]; }; }打印「\ n」「'這工作 – Neha