2012-10-27 43 views
0

我有一個大的文件(共有39,000行文字)的是包括以下內容:如何切換文本週圍的線

1:iowemiowe093j4384d 
2:98j238d92dd2d 
3:98h2d078h78dbe0c 
(continues in the same manner) 

,我需要反轉兩個順序該線的部分,所以輸出會是:

iowemiowe093j4384d:1 
98j238d92dd2d:2 
98h2d078h78dbe0c:3 

相反,我一直在使用切做這個嘗試,但一直沒能得到它的正確的行爲(這是在bash環境),有什麼將是最好的方式來做到這一點?

回答

6
awk -F: '{print $2":"$1}' input-file 

或者

awk -F: '{print $2,$1}' OFS=: input-file 

如果你可以有超過2個字段:

awk -F: '{print $NF; for(i=NF-1; i; i--) print ":"$i }' input-file 

或者

perl -F: -anE '$\=:; say reverse @F' input-file 

perl -F: -anE 'say join(':', reverse @F)' input-file 

(兩者perl的解決方案是未經測試,相信有缺陷的,每個都需要一個chop $F[-1]或類似去除換行符在輸入。)

+0

不應該是'$ 2':「$ 1」來反轉字段嗎? –

+0

@David的確,謝謝。 –

+0

爲'awk'部分+1。 – alk

0

一種使用GNU sed方式:

sed -ri 's/([^:]+):(.*)/\2:\1/' file.txt 

結果:

iowemiowe093j4384d:1 
98j238d92dd2d:2 
98h2d078h78dbe0c:3 
0

純Bash和幾乎一樣快,從威廉Pursell awk的解決方案,只是沒有那麼優雅:

paste -d: <(cut -d: -f2 input-file) <(cut -d: -f1 input-file)