2016-07-26 77 views
1

我有一個這樣的文件:這段代碼爲什麼沒有用換行符替換空格?

17336 GRMZM2G000118 GRMZM2G000118 
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854 
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028 

線受空間
我試圖從第二場,直到切成末場,並將其轉換分隔成一列:
輸出應

使用該命令
GRMZM2G000118 
GRMZM2G000118 
GRMZM2G404941 
GRMZM2G404922 
GRMZM2G104854 
... 

cut -f 2- < input.txt | tr " " "\n" > new_file.txt 

但這是行不通的

唯一的指揮工作來解決這個問題是:

awk '{for(i=2;i<=NF;++i)print $i}' 

或者

sed 's/\s\+/\n/g' 

我的問題是,爲什麼第一種方式不工作?

+1

這可能是與事實,你有多個空格做。您可能希望事先擠壓它們:'tr -s'' fedorqui

+1

它被接受作爲一個答案謝謝 –

回答

1

我的文件是這樣的:

17336 GRMZM2G000118 GRMZM2G000118 
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854 
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028 

線通過的空間,我試圖從第二 場,直到切成末場,並將其轉換分隔成一列:輸出應該是

使用該命令
GRMZM2G000118 
GRMZM2G000118 
... 

cut -f 2- < input.txt | tr " " "\n" > new_file.txt 

我的問題是爲什麼第一種方式不起作用?

您這裏有兩個問題:

  • cut默認的分隔符是TAB。
  • 多個空格不與cut,相反的是awk確實擠在一起。

要解決第一個問題,請使用-d ' '設置分隔符。爲了解決第二個,與tr -s ' '擠壓空間:

$ echo "hello  how are you" | cut -f2- 
hello  how are you 
$ echo "hello  how are you" | cut -d' ' -f2- 
    how are you 
$ echo "hello  how are you" | tr -s ' ' | cut -d' ' -f2- 
how are you 

總之你的命令應該是:

tr -s ' ' < input.txt | cut -d ' ' -f 2- | tr " " "\n" > new_file.txt 

所以,現在你有一堆命令,時間移動到awk的版本: )

0

這樣做:

cut -d' ' -f2- <input.txt | tr " " "\n" > new_file.txt

編輯:
說明:你需要添加一個分隔符爲你的領域。

1

以下命令爲我工作(假設分隔符是空格)。

cut -d " " -f 2- <input.txt | tr " " "\n" >new_file.txt

GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028

你可以添加更多的信息,比如你使用了什麼分隔符?

0

cut默認情況下假定字段由單個製表符分隔。無法在每個字段之間指定可變數量的空格,這似乎是您在輸入數據中所擁有的空間。

我個人建議使用你在問題中顯示的awk腳本或類似的東西。

1

我建議使用此AWK:

awk -v OFS="\n" '{sub(/^[[:space:]]*[^[:space:]]*[[:space:]]*/, ""); $1=$1} 1' file 

GRMZM2G000118 
GRMZM2G000118 
GRMZM2G404941 
GRMZM2G404922 
GRMZM2G104854 
GRMZM5G800488 
GRMZM5G800488 
GRMZM2G152059 
GRMZM2G152059 
GRMZM2G152028 
GRMZM2G152028 

sub函數^[[:space:]]*[^[:space:]]*[[:space:]]*是用於從每一行中除去第一列。

使用cut可以創建多個空間的問題,因爲這將它們轉換成多個換行符。

+0

似乎是一個很大的努力相比,簡單的循環,在這個問題中使用的OP! –

+0

嗯,我覺得使用'sub'比使用循環 – anubhava

+0

更好SED的/ \ s \ +/\ N/G'會做工作,而不是這一切的努力,目前仍是問題是,爲什麼TR「」「\ n「不能使用切割 –

相關問題