2017-08-25 48 views
1

我有一個文件,它看起來像這樣多個點列: chr10:100013403..100013414,- 0 0 0 0 chr10:100027943..100027958,- 0 0 0 0 chr10:100076685..100076699,+ 0 0 0 0 如何分割它具有使用Linux命令行

我想輸出是這樣的: chr10 100013403 100013414 - 0 0 0 0 chr10 100027943 100027958 - 0 0 0 0 chr10 100076685 100076699 + 0 0 0 0

所以,我想第一列要在選項卡分隔字段分隔符=:,..
我已經使用awk -F":|," '$1=$1' OFS="\t" file來分隔第一列。但是,我仍然在努力與..字符。 我試過awk -F":|,|.." '$1=$1' OFS="\t" file但這不起作用。

回答

1

..應該逃脫。

awk -F':|,|\\.\\.' '$1=$1' OFS="\t" file 

重要的是要記住,當你將一個字符串常量爲FS的價值,它經歷了正常的awk的字符串處理是很重要的。例如,在Unix awk和gawk中,賦值FS = "\.."將字符串..分配給FS(反斜槓被剝離)。這將創建一個正則表達式,意思是「字段由任何兩個字符的出現分隔」。如果相反您希望字段由文字句點和任意單個字符分隔,請使用FS = "\\.."

https://www.gnu.org/software/gawk/manual/html_node/Field-Splitting-Summary.html

+0

是的,約翰。這是我正在嘗試,但沒有奏效。任何評論@haolee? –

+0

@ John1024哦,我犯了一個錯誤。你是對的!這兩個句點都應該被轉義,因爲'\\ ..'的意思是「一個文字句點後跟任意單個字符」,而\\。\\。表示「兩個文字句點」。 ''\\''可以將'123.a123'分割爲'123 \t 123',而'\\。\\。'不要分割這個字符串。如果輸入字符串是「123..123」,這兩個字段分隔符會導致相同的結果。感謝您的更正!答案已更新。 @Shubham Gupta – haolee

+0

@haolee優秀。 +1。 – John1024

0

如果您INPUT_FILE是相同的,如圖然後樣品以下可以幫助你太一樣。

awk '{gsub(/:|\.+|\,/,"\t");} 1' Input_file 

在這裏,我使用GSUB AWK的關鍵字來全局替代(:)(。+,其將採取一切點)(,)使用TAB,然後1將打印INPUT_FILE的編輯/非編輯的行。我希望這有幫助。