2013-03-18 22 views
0

我有一個看起來像這樣的「MM/YYYY,數據」的格式輸入數據:單柱,以多列可調行列數AWK

Location 1 
08/2012, 44.1 
09/2012, 34.2 
10/2012, 24.3 
11/2012, 14.4 
12/2012, 04.5 
01/2013, 14.6 
02/2013, 24.7 
Location 2 
08/2012, 33.1 
09/2012, 44.2 
10/2012, 55.3 
11/2012, 66.4 
12/2012, 77.5 
01/2013, 88.6 
02/2013, 11.7 
Location 3 
08/2012, 35.1 
09/2012, 45.2 
10/2012, 55.3 
11/2012, 66.4 
12/2012, 77.5 
01/2013, 71.6 
02/2013, 19.7 
Location 4 
etc 
etc 

和我使用一個awk腳本是這樣的 -

awk'} printf(NR%276 == 0)? $ 0「\ n」:$ 0「\ t」}'inputfile(我使用NR%276,因爲這是每個新重複列的列長度或上面部分中顯示的原始數據中的「位置」)。 Awk可以將輸出的n列中的「位置X」的單列數據塊分割爲「位置Y」?

我得到了輸出,但它不正確以文本換行方式水平運行單個輸入文件的輸出或像這樣「蛇行」 - 位置1 mm/yyyy,data1 data2等位置2 mm/yyyy, DATA1 DATA2等地理位置3月/年,DATA1 DATA2等

相反,我需要將數據輸出到這個類似但對於276行和150列/位置或「位置」的數據的最後一列塊輸入文件中有276行(上面顯示的縮短示例)。例如,對於03/2013或大於150個地點,將行數增加到277會有所幫助。

Location 1  Location 2  Location 3 
08/2012, 44.1  08/2012, 33.1  08/2012, 35.1 
09/2012, 34.2  09/2012, 44.2  09/2012, 45.2 
10/2012, 24.3  10/2012, 55.3  10/2012, 55.3 
11/2012, 14.4  11/2012, 66.4  11/2012, 66.4 
12/2012, 04.5  12/2012, 77.5  12/2012, 77.5 
01/2013, 14.6  01/2013, 88.6  01/2013, 71.6 
02/2013, 24.7  02/2013, 11.7  02/2013, 19.7 

謝謝!

回答

0

另一個awk的你可以嘗試:

awk '!/^[0-9]/{n=0} {n++; A[n]=A[n] (A[n]?OFS:x) $0} END{for(i=1; i<=n; i++) print A[i]}' OFS='\t' file 

要在每個位置只打印第二欄:

awk '!/^[0-9]/{n=0} {n++; A[n]=A[n] (A[n]?OFS:x) $2} END{for(i=1; i<=n; i++) print A[i]}' OFS='\t' file 
+0

好的,它的工作原理。我必須弄清楚如何爲每個「位置」或列標題僅打印$ 2或第二列。任何想法?目前,它打印1美元和2美元。謝謝, – user2100039 2013-03-19 15:37:34

+0

@ user2100039:增加了快速修復 – Scrutinizer 2013-03-19 15:47:27

1

嘗試這一個班輪:

awk '/^Location/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file 

  • 上面一行將您的一列投入3列輸出,沒有處理你的276 rows東西。 (我不認爲我們需要做那個計算。)
  • 在輸出中,列號是tab分開。
  • 行和列,沒有硬編碼的,你可以用你的真實數據

測試與您的數據進行測試:

kent$ awk '/^Location/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file  
Location 1  Location 2  Location 3 
08/2012, 44.1 08/2012, 33.1 08/2012, 35.1 
09/2012, 34.2 09/2012, 44.2 09/2012, 45.2 
10/2012, 24.3 10/2012, 55.3 10/2012, 55.3 
11/2012, 14.4 11/2012, 66.4 11/2012, 66.4 
12/2012, 04.5 12/2012, 77.5 12/2012, 77.5 
01/2013, 14.6 01/2013, 88.6 01/2013, 71.6 
02/2013, 24.7 02/2013, 11.7 02/2013, 19.7 

編輯徵求意見

awk '!/^[0-9]/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=277&&m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file 
  • 上面的行不會匹配硬編碼的「位置」,但對於非數字標題(wo rks for「locations」)
  • 276,277我不知道這是什麼意思。但上面的單行將爲每個塊(在您的示例中的位置),打印最多276行。如果行號小於276,則只打印實際的行數。

您可以稍微調整一下,以適應您的需求。

祝你好運。

+0

對不起,列標題「位置1,等」是這個例子,但實際上他們是改變,因此「位置」從來沒有出現在輸入文件名。它可以只搜索任何長度的字符串嗎? – user2100039 2013-03-18 17:52:36

+0

在輸入文件中,數據行= 276,包括標題行= 277.再次感謝 - – user2100039 2013-03-18 17:54:29

+0

@ user2100039那麼在您的真實數據中,「位置」是什麼?遵循某種模式?無論如何,我認爲我的單線讓你開始。 – Kent 2013-03-18 17:56:21

1

假設每個位置具有相同數量的數據行:

numcols=$(tac input_file | awk '$1 == "Location" {print $2; exit}') 
pr -t -s --columns=$numcols input_file 

既然你知道有多少行中的每個位置,計算出的位置號碼與:

numcols=$(($(wc -l < input_file)/277)) 
+0

謝謝 - 實際文件中的「位置」標題不使用單詞「位置」,而是它們是唯一的「位置」,如Flatiron,Wolfbog,Mesavista等。數據行是= 276 +標題對於需要打印爲新列的每個數據塊。謝謝! – user2100039 2013-03-18 19:05:19

+0

glenn-當我運行此代碼時出現「非法變量名稱」錯誤,並在分別運行numcols代碼以查找位置數量時出現相同的錯誤消息。想法? – user2100039 2013-03-19 15:33:29

+0

真的嗎?你用什麼shell(bash/csh/...)?向我們展示您*實際執行的代碼。請注意,外部括號加倍,內部括號是單個 – 2013-03-19 16:54:32