2015-07-11 22 views
2

我有這個文件(的test.txt):從文件中提取信息,並將其作爲列添加到另一個文件

########### 
########### 
1x1 1y1 
1x2 1y2 
########### 
########### 
2x1 2y1 
2x2 2y2 
########### 
########### 
3x1 3y1 
3x2 3y2 

的1x1,1x2的,1Y1,1Y2,等表示十進制,積極和負數 數字量

# #對應於文本和數字標題是不想處理的值。每個包含9行,以數字

或字母開頭。

,我想這生成輸出文件(output.txt中)使用管道:

1x1 1y1 2x1 2y1 3x1 3y1 
1x2 1y2 2x2 2y2 3x2 3y2 

嘗試:(test.sh)

touch output.txt 

paste -d' ' output.txt <(sed '5,12d' test.txt | sed '1,2d' | awk '{print $1" "$2}') > output.txt 
paste -d' ' output.txt <(sed '9,12d' test.txt | sed '1,6d' | awk '{print $1" "$2}') > output.txt 
paste -d' ' output.txt <(sed '1,10d' test.txt | awk '{print $1" "$2}') > output.txt 

結果: 貓output.txt的

3x1 3y1 
3x2 3y2 

我在做我的腳本錯了嗎?

我忘了提及test.txt文件實際上有1,000,000行。因此,我想要有效地做到這一點。我通過使用輔助文件解決了這個問題,但是性能很慢。這就是爲什麼我想不使用輔助文件。

問候

+0

您使用文件output.txt同時讀取和寫入命令,然後每次擦除內容。每次使用不同的文件名,它的工作原理(即使這不是一個好的解決方案) – yolenoyer

回答

1
paste <(grep "^1x" test.txt) <(grep "^2x" test.txt) <(grep "^3x" test.txt) 
1x1 1y1 2x1 2y1 3x1 3y1 
1x2 1y2 2x2 2y2 3x2 3y2 

編輯:以此爲骨架(不需要調用paste 3次):

paste <(grep <your_regex_1> test.txt) \ 
     <(grep <your_regex_2> test.txt) \ 
     <(grep <your_regex_3> test.txt) 
+0

這是對特定情況的良好迴應。但是,1x1 1x2等代表變量,可能是任何數值。 ####包含字母和數字。 只是簡化了文件,抱歉沒有放置更多細節。 – Crossroad

+0

這個想法是,你可以通過調用'paste'一次來產生輸出。只需在三個流程替換的每一箇中插入您的個人正則表達式規則即可。 –

1

如果總是有數字的兩列中輸入,所以你總是有兩排輸出:

awk 'NF==2 {row1=row1 $0 " "; getline; row2=row2 $0 " "} END {print row1; print row2}' test.txt 

輸出:

1x1 1y1 2x1 2y1 3x1 3y1 
1x2 1y2 2x2 2y2 3x2 3y2 

如果####線可能有兩個領域,你必須將目標NF==2調整到更具體的東西。

0

這可能爲你工作(GNU SED):

sed -r '/^\S+ \S+/N;//H;$!d;x;s/.//;:a;s/^([^\n]*)\n([^\n]*)\n([^\n]*)\n([^\n]*)/\1 \3\n\2 \4/;ta' file 

這節省了所需的數據保留空間,然後使用模式匹配來構建所需的輸出。

相關問題