2016-05-13 55 views
2

我想從兩個時間戳刪除毫秒時間戳刪除毫秒(列8,9)從特定列

1  20 2 14000 14000 11 1 10:11:56.136 10:11:56.136 0 1 

我一直在使用下面的sed命令將其刪除:

sed 's/\(:[0-9][0-9]\)\.[0-9]\{3\}/\1/g' 

這工作得很好。不過我注意到,在我的文件我有其他的時間戳記,我只有兩毫秒有的還帶有一毫秒:

**10:46:27.93 10:46:27.90** and some with only one millisecond 10:46:2  10:46:2 

我要撤銷我已刪除的文件兩毫秒又跑到我的sed命令三毫秒。像這樣:

sed 's/\(:[0-9][0-9]\)\.[0-9]\{2\}/\1/g' 

這很好,因爲我看到它從時間上移除了兩毫秒。

問題:

運行上面的命令後,我看到它有時也被修改了一些我的其他列。我不包括我的所有專欄,因爲它很難閱讀。我有大約40列。我只是想修改我怎麼能照顧所有三種情況下用一個命令列8,9

問題

。當我說三種情況下,我的意思是當有兩毫秒,一毫秒和三毫秒。另外,如何確保我只有只有修改第8和第9列。

任何幫助真的很感激。謝謝!!!

+0

嘗試解決它只能從時間戳刪除,使用''S/\( [0-9] [0-9]:[0-9] [0-9]:[0-9] [0-9] \)\ [0-9] \ {2,\}/\ 1/g''。否則,請嘗試''/^\([[:blank:]] * \([^ [:space:]] + [[:blank:]] +)\ {7 \} [0-9] [0 -9]:[0-9] [0-9]:[0-9] [0-9])\ [0-9] \ {2,\} \([[:空白:]] + [ 0-9] [0-9]:[0-9] [0-9]:[0-9] [0-9])\ [0-9] \ {2,\}/\ 1 \ 3/g''(不確定,但你可能還需要轉義'+') –

回答

1

所以你的毫秒想帶的,如果你的時間也有類似的格式試試這個

sed -E 's/(:[0-9]+)\.[0-9]+/\1/g' 
1

根據您的sed版本,你可以使用:

sed -E 's/\.\d{1,3}//g' 

sed -E 's/\.[0-9]{1,3}//g' 

Bash Demo

1

在你正是3位與當前指定的正則表達式:

\{3\} 

爲了讓這個1和數字之間的3你可以寫:

\{1,3\} 

要更換僅在第8和第9如果可能的話,使用sed的列極其困難。 但有解決方法可能爲你工作,如果我們可以做一些假設:

  • 列第八永遠比不上
  • 之前的第8和第9欄將始終與

在這種情況下,你可以刪除/g標誌,每輸入的每一行申請兩次更換,那就是:

sed -e cmd -e cmd 

其中cmd是:

's/\(:[0-9][0-9]\)\.[0-9]\{1,3\}/\1/' 
2

只是在awk初學者,所以道歉,如果發現效率較低。

awk '{gsub(/\.[0-9]*/,"",$8);gsub(/\.[0-9]*/,"",$9);print}' file 

將單獨從第8列和第9列中刪除毫秒值。邏輯很簡單。

  • 卸下任何字符集合以下後跟任意數量的數字

在動作模式.: -

$ cat file 
1  20 2 14000 14000 11 1 10:11:56.136 10:11:56.136 0 1 

$ awk '{gsub(/\.[0-9]*/,"",$8);gsub(/\.[0-9]*/,"",$9);print}' file 

1 20 2 14000 14000 11 1 10:11:56 10:11:56 0 1 

現在柱7改變爲具有.值。請參閱以下操作

$ cat file 
1  20 2 14000 14000 11 1.1 10:11:56.136 10:11:56.136 0 1 

$ awk '{gsub(/\.[0-9]*/,"",$8);gsub(/\.[0-9]*/,"",$9);print}' file 

1 20 2 14000 14000 11 1.1 10:11:56 10:11:56 0 1 

第7列保持不變。

1

這就是我想出的。它基本上跳過使用(\S+\s+){7}7列則修復了以下兩列:

sed -re 's/(\s*(\S+\s+){7})([^.]+)\.\S+([^.]+)\.\S+/\1\3\4/g' 
0

我有同樣的問題 我

sed 's/\.[0-9]*//' source> destination