我有一个可能指数级的文件。我需要每隔4行并将其移到上面四行。
0 1 BXP_0_1 RRUS11B12 RRU-1 3.2 (35.0) 3.4 (35.4) 1.25 (19.2) 1.11 (25.9) site_A (15,11)
0 1 BXP_1_1 RRUS11B12 RRU-2 4.3 (36.3) 3.2 (35.0) 1.26 (18.8) 1.20 (21.0) site_B (16,10)
0 1 BXP_2_1 RRUS11B12 RRU-3 4.4 (36.4) 3.1 (34.9) 1.34 (16.7) 1.11 (25.3) site_C (15,11)
AuxPlugInUnit=RRU-1,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=A
AuxPlugInUnit=RRU-2,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=B
AuxPlugInUnit=RRU-3,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=C
我希望它看起来像是:
0 1 BXP_0_1 RRUS11B12 RRU-1 3.2 (35.0) 3.4 (35.4) 1.25 (19.2) 1.11 (25.9) site_A (15,11) AuxPlugInUnit=RRU-1,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=A
0 1 BXP_1_1 RRUS11B12 RRU-2 4.3 (36.3) 3.2 (35.0) 1.26 (18.8) 1.20 (21.0) site_B (16,10) AuxPlugInUnit=RRU-2,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=B
0 1 BXP_2_1 RRUS11B12 RRU-3 4.4 (36.4) 3.1 (34.9) 1.34 (16.7) 1.11 (25.3) site_C (15,11) AuxPlugInUnit=RRU-3,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=C
它会将其关闭,但输出应该全部在线,所以需要这六行并且只给我3行。我需要这样做,因为文件中有许多行。
答案 0 :(得分:1)
试试这一行,我只是阅读了您使用的数据\s and \S
,您可以更改grep中的regex
以满足您的需求
paste <(grep '^\s' file) <(grep '^\S' file)
输出:
kent$ paste <(grep '^\s' f) <(grep '^\S' f)
0 1 BXP_0_1 RRUS11B12 RRU-1 3.2 (35.0) 3.4 (35.4) 1.25 (19.2) 1.11 (25.9) site_A (15,11) AuxPlugInUnit=RRU-1,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=A
0 1 BXP_1_1 RRUS11B12 RRU-2 4.3 (36.3) 3.2 (35.0) 1.26 (18.8) 1.20 (21.0) site_B (16,10) AuxPlugInUnit=RRU-2,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=B
0 1 BXP_2_1 RRUS11B12 RRU-3 4.4 (36.4) 3.1 (34.9) 1.34 (16.7) 1.11 (25.3) site_C (15,11) AuxPlugInUnit=RRU-3,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=C
答案 1 :(得分:1)
perl -ne'
chomp;
push @r, $_;
if ($. %3 ==0) { print "$_ ", scalar <> for @r; @r=() }
' file
答案 2 :(得分:0)
与kev类似,我假设你想要合并文件的两半。
计算文件中的行数。然后,将两个打开的文件句柄保存到同一个文件中,其中一个指向开头,第二个指向中间行。然后只需从每个文件句柄中读取一行并打印:
#!/usr/bin/perl
use warnings;
use strict;
my $filename = shift;
open my $IN, '<', $filename or die $!;
1 while (<$IN>);
my $line_count = $.;
die "Odd number of lines.\n" if $line_count % 2;
seek $IN, 0, 0;
open my $SECOND, '<', $filename or die $!;
<$SECOND> for 1 .. $line_count / 2;
for (1 .. $line_count / 2) {
chomp(my $first = <$IN>);
print $first, scalar <$SECOND>;
}
用法:perl script.pl data > data.new
答案 3 :(得分:0)
sed -n 's/.*/²&³/
1 {h;b
}
2,3 {H;b
}
x;H;g
s/²\([^³]*\)³\(\n\)²\([^³]*\)³\(.*\)/\3 \1\4/
P
s/^[^²]*²/²/
h
' YourFile
需要2个分隔符(任意²
和³
)。只要确保它们不使用char。如果是这种情况并且找不到其他分隔符,则第一个预先操作是在文本中转义分隔符并将其作为后处理放回
答案 4 :(得分:0)
n=$(( $(wc -l < file) / 2 ))
awk -v n=$n 'NR<=n {line[NR]=$0; next} {printf "%s %s\n", line[NR-n], $0}' file