2014-10-07 61 views
2

^M字符我有一個​​很長的文件,該文件是這樣的:AWK:輸出文件包含在文件名

0a 
190 0.121212 
191 0.232323 
... 
0b 
190 0.1212 
191 0.4545 
... 
16c 
190 0.34654 
191 0.567565 
... 

我用awk使用此命令將文件分割成許多小文件:

awk '/[0-9][a-c]/{close(x); x=$0;}{print > x;}' spectrum.tsv 

這工作,但輸出文件的名稱似乎都在文件名的末尾包含一個換行符: enter image description here

我試圖雷莫ve的換行符與「sub」像這樣:

awk '/[0-9][a-c]/{close(x); x=$0;}{sub(/^M/,"",x)}{print > x;}' spectrum.tsv 

但是,這導致了相同的結果。

所以我的問題是,如何避免輸出文件名中的換行符? 我正在使用OSX 10.10順便說一句。輸入文件來自Windows機器。

+0

您是如何到達'^ M' charac在'sub()'裏面?如果沒有嘗試過,嘗試輸入'ctrl-v + ctrl-M'而不是'^ M'。 – Fazlin 2014-10-07 09:23:22

+0

在輸入文件中是否存在DOS/windows - Linux Carriage return問題? – Kent 2014-10-07 09:25:21

+0

@Kent:是的,輸入文件來自Windows機器。我相應地編輯了這個問題。 – gha 2014-10-07 12:16:28

回答

3

運行dos2unix在你讓awk處理它們之前你的文件! 它會刪除DOS風格的行結尾,這可能是什麼導致你的頭疼。

+0

似乎dos2unix在OSX上不可用,但是我發現了這個解決方法:cat foo | col -f> foo2。我在http://schmeits.wordpress.com/2010/08/26/dos2unix-alternative-those-darn-m-characters/ – gha 2014-10-07 12:13:34

0

公開賽在vi編輯器,進入到命令模式,然後: 型":%s/[CTRL+V][CTRL+M]//g"

+0

上找到了這兩個字符'\ r',它的工作原理也很簡單,輸入起來也很方便。 – 2014-10-07 10:53:14

1

您可以只設置在AWK適當的記錄分隔輸入文件中採取的\r護理:

awk -v RS='\r?\n' '/[0-9][a-c]/{close(x); x=$0;}{print > x;}' spectrum.tsv 

這裏RS='\r?\n'RS作爲可選\r^M),然後是\n

+1

你應該提到多字符RS使這隻gawk只。在某些平臺上,您還需要添加'-v BINMODE = 3'。 – 2014-10-07 11:41:17

+0

我剛試過這個。它適用於第一個文件,它被寫爲「0a」。但是,以下文件現在稱爲「?0b」,「?0c」,... – gha 2014-10-07 11:42:45