2017-06-20 61 views
1

我有一個從海洋儀器中卸載的文件列表。出於某種原因,偶爾會有一個非ASCII字符插入到ASCII字符應該在的位置。我找到了嚴重的E(È),在那裏應該有一個W來表示西半球的經度記錄。Bash/Linux在.txt文件中查找非ASCII字符並將其替換爲ASCII字符

下面是數據的模樣:

CUMSECS Date UTC Time UTC Date Local Time local Z (m) Target Z Z Bot Temp PAR Salin Ang VelX Ang VelY Ang VelZ Pump + Pump - Gctr Fix secs Date UTC Time UTC Date Local Time Local Lat LatD Latm  Lon LonD Lonm  DOP Temp PAR Salin Batt V  CMD secs Date Local Time Local No. Cmds 
526068034 09/01/16 18:00:34 09/01/16 11:00:34  3.75 2.69  
3.75  0.29 0.000000 0.00 -12 -70 -50 0 5 10 
526068039 09/01/16 18:00:39 09/01/16 11:00:39  3.75 2.69  
3.75  0.29 0.000000 0.00 -12 -70 -50 0 5 10 
526068044 09/01/16 18:00:44 09/01/16 11:00:44  3.74 2.69  
3.75  0.29 0.000000 0.00 -12 -70 -50 0 5 10 
526068049 09/01/16 18:00:49 09/01/16 11:00:49  3.73 2.69  
3.75  0.29 0.000000 0.00 -30732 13588 31909 60399 7538 -82 
543622771 03/23/17 22:19:31 03/23/17 15:19:31 38.31877 38 
19.1262 N 123.07136 123 4.2812 È 23.6 115.06  0.0000 96.00 
121.718 
547764151 05/10/17 20:42:31 05/10/17 13:42:31  0.03 16.00 
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0 
547764152 05/10/17 20:42:32 05/10/17 13:42:32  0.00 16.00 
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0 

我用下面的Bash行能找到非ASCII字符 pcregrep -n '[^\x00-\x7F]' 170510_ocean_Copepod.txt

我想通過一系列文件的循環,發現這些字符,並用'W'替換它們,以便我可以隨後將它們讀入R並集中處理它們。或者,R對嘗試讀取這些文件(「位置中的多字節字符串」)返回的錯誤的解決方法對我的目的同樣有效。任何幫助非常感謝。

+2

你嘗試過什麼到目前爲止,該命令使用iconv將文件轉換? –

+0

'pcregrep -n'[^ \ x00- \ x7F]'170510_ocean_Copepod.txt | sed's/[^ \ x00- \ x7F]/W/g''但在sed調用中返回一個非法字節序列的錯誤 – SeaSpider

+0

您是否嘗試更改'read.table'的'fileEncoding'參數? – Scarabee

回答

1

我認爲這個問題是在È UTF-8是由\xc3\x88sed似乎無法應付無論出於何種原因多字節字符。作爲@Jack建議,tr可能是工作(在bash測試不具有pcregrep窗戶)一個更好的工具:

[email protected]:~$ grep -P '[^\x00-\x7f]' | tr 'È' 'W' 
19.1262 N 123.07136 123 4.2812 WW 23.6 115.06  0.0000 96.00 

注意到它分別都轉換字節來W

另一種方法可能是使用iconv轉換整個文件。 iso-8859-15(latin-9)是單字節字符編碼的一個例子。

iconv -f utf-8 -t iso-8859-15 -o <converted-file> <input-file> 
+1

另一個選擇可能是使用'iconv'轉換文件編碼,然後在'r'中讀取。 –

+0

看起來像tr的shell方法可以工作,但我也對編碼很好奇。你知道我可以轉換的編碼不包含任何多字節字符,並可以隨後讀入R?感謝您的有用建議。 – SeaSpider

+0

看起來tr方法也被掛起了。我得到一個錯誤:'tr:非法字節序列'是否使用'cat | tr'È''W''或'pcregrep -n'[^ \ x00- \ x7F]'170510_ocean_Copepod.txt | tr'È''W''。如果我使用貓方法,它會在返回錯誤之前打印出È所在的行。 – SeaSpider

0

您可以使用sed更換ÈW

sed 's/È/W/g' 170510_ocean_Copepod.txt