2013-12-19 29 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 
... 

所有你需要的是已经在这里: