2013-12-19 31 views
0

我的如下數據:如何打印多行作爲字段?

P04637 1A1U 1AIE 1C26 1DT7 1GZH 1H26 1HS5 1JSP 1KZY 1MA3 1OLG 1OLH 1PES 1PET 1SAE 1SAF 1SAK 1SAL 1TSR 1TUP 1UOL 1XQH 1YC5 1YCQ 

但我想如下:

P04637 1A1U 
P04637 1C26 
P04637 1AIE 
P04637 1DT7 
P04637 1XQH 
P04637 1MA3 
P04637 1PES 
P04637 1SAE 
+0

Perl或awk中..哪一個? –

+0

你有什麼嘗試?你有什麼問題? StackOverflow不是「爲我編寫我的代碼」服務。 –

+1

@DaveCross - 我無法理解對此的最高票...沒有努力和一個最初不可理解的非問題 – fugu

回答

0

作爲perl腳本:

use warnings; 
use strict; 

open my $input, '<', 'in.txt' or die "$!"; 

while (<$input>){ 
    my @split = split; 
    my $spacer = shift @split; 
    print "$spacer $_\n" foreach @split; 
} 

打印:

P04637 1A1U 
P04637 1AIE 
P04637 1C26 
P04637 1DT7 
P04637 1GZH ... 
+0

他不要求製表人。 – ceving

+2

@ceving - 他並不真正要求任何東西。 – fugu

4

這版畫日e第一個字段,然後是每個後續字段,直到行結束。

$ awk '{for (i=2;i<=NF;i++) print $1,$i}' file         
P04637 1A1U 
P04637 1AIE 
P04637 1C26 
P04637 1DT7 
P04637 1GZH 
P04637 1H26 
P04637 1HS5 
P04637 1JSP 
P04637 1KZY 
P04637 1MA3 
P04637 1OLG 
P04637 1OLH 
P04637 1PES 
P04637 1PET 
P04637 1SAE 
P04637 1SAF 
P04637 1SAK 
P04637 1SAL 
P04637 1TSR 
P04637 1TUP 
P04637 1UOL 
P04637 1XQH 
P04637 1YC5 
P04637 1YCQ 

要得到什麼OP請求,沒有多,不會少:

awk '{print $1,$2 RS $1,$4 RS $1,$3 RS $1,$5 RS $1,$23 RS $1,$11 RS $1,$14 RS $1,$16}' file 
P04637 1A1U 
P04637 1C26 
P04637 1AIE 
P04637 1DT7 
P04637 1XQH 
P04637 1MA3 
P04637 1PES 
P04637 1SAE 
+0

經典解決方案.. +1 – Kent

+0

嗨,所有,只是意識到原來的問題是要求隨機出口,看到我的解決方案。 :-) – BMW

+0

你怎麼能說出OPs文本的形式。他可能寫錯了。所有行都沒有列在輸出請求中,所以他可能只需要一些。比這裏的所有解決方案都是錯誤的。 – Jotne

0

就實現了原來的問題是問隨機出口

awk 'BEGIN{srand($RANDOM)} 
{ split($0,a,FS); 
    for (i=2;i<=NF;i++) 
    { while (1) 
     { s=int(rand()*(NF-1)+2) 
      if (a[s]!="") {print $1,a[s];delete a[s];break} 
     } 
    } 
}' file 

結果

P04637 1C26 
P04637 1H26 
P04637 1DT7 
P04637 1HS5 
P04637 1AIE 
P04637 1GZH 
P04637 1A1U 
+1

對於隨機順序'awk'{for(i = 2; i <= NF; i ++)print $ 1,$ i}'file |排序-R' –

+0

爲什麼使用數字'14'? '$ RANDOM'將等於空字符串'「」'我認爲.. –

+0

你是對的,我已經更新到NF-1。我在 – BMW

2

使用awk另一種方法:

awk 'NR==1 {a=$1; next} {print a,$1}' RS=" " file 

通過設置RS=" "我們定義行分隔符的空間。這樣,我們將每次獲取不同的記錄。

NR==1意味着在閱讀第一條記錄時。在那裏,我們存儲第一個值。從這一點開始,我們一直在寫保存的值+當前值。

它返回:

P04637 1A1U 
P04637 1AIE 
P04637 1C26 
P04637 1DT7 
P04637 1GZH 
P04637 1H26 
P04637 1HS5 
P04637 1JSP 
P04637 1KZY 
P04637 1MA3 
P04637 1OLG 
P04637 1OLH 
P04637 1PES 
P04637 1PET 
P04637 1SAE 
P04637 1SAF 
P04637 1SAK 
P04637 1SAL 
P04637 1TSR 
P04637 1TUP 
P04637 1UOL 
P04637 1XQH 
P04637 1YC5 
P04637 1YCQ 
+0

不錯的+1。我寫了一個設置「OFS」的文字,但留下了一個空行。這個更好。 – Kent

+0

嗨,所有,只是意識到原來的問題是要求隨機出口,看到我的解決方案。 :-) – BMW

+2

那麼@BMW我不會隨意說。我想這個例子的輸出就是這樣一個例子,有這個想法。作者的一些澄清可能會有所幫助。 – fedorqui

2
perl -lane '$v=shift @F; print "$v $_" for @F' file 
1
perl -lane 'print "$F[0] $_" for(@F[1..$#F])' 
1

無論是Perl的,也不awk中需要這份工作。 Bash是不夠的:

{ IFS=' ' read -r -a A ; for I in ${A[@]:1} ; do echo ${A[0]} $I ; done ; } <<<'P04637 1A1U 1AIE 1C26 1DT7 1GZH 1H26 1HS5 1JSP 1KZY 1MA3 1OLG 1OLH 1PES 1PET 1SAE 1SAF 1SAK 1SAL 1TSR 1TUP 1UOL 1XQH 1YC5 1YCQ' 
P04637 1A1U 
P04637 1AIE 
P04637 1C26 
... 

所有你需要的是已經在這裏: