[英]Declaring variables from data, and running multiple commands on data in one line of code
今天,我遇到了一个错误,希望别人能提供我所没有的解决方案的意见。 错误在数据集中。 第一行和第二行/记录的最后一列/字段中的数据应相同,并且行/记录1的倒数第二列/字段始终为“ 1”。 问题是当情况并非如此时,需要采取纠正措施。
这样的错误数据就存在于名为“ sample.txt”的文件中:
5@Comedia @5@3@2@3@1/2 @3@1.6 @1@2 1/2@11@14 1/4
3@Melanistic@3@4@2@4@1 1/2@4@2 3/4@3@5 @2 @4 3/4
2@Pure @4@5@5@5@3 1/2@5@4 3/4@5@8 @3 @6 1/2
4@Profit @2@2@1@2@1.6 @1@1.6 @2@2 1/2@4 @6 1/2
1@Whammy @1@1@1@1@1.6 @2@1.6 @4@5 1/2@5 @8 1/4
正确的数据应如下所示:
5@Comedia @5@3@2@3@1/2 @3@1.6 @1@2 1/2 @1@4 3/4
3@Melanistic@3@4@2@4@1 1/2@4@2 3/4@3@5 @2@4 3/4
2@Pure @4@5@5@5@3 1/2@5@4 3/4@5@8 @3@6 1/2
4@Profit @2@2@1@2@1.6 @1@1.6 @2@2 1/2 @4@6 1/2
1@Whammy @1@1@1@1@1.6 @2@1.6 @4@5 1/2 @5@8 1/4
我当前的解决方案是一个多步骤的过程,我有一种可以简化的感觉。 任何建议都将受到高度赞赏。
1)创建一个bash变量:
length=$(cat sample.txt |awk -F@ 'NR==2{print $NF}')
2)在第1行中创建具有正确信息的文件:
awk -F@ -v l="$length" 'NR==1{$(NF-1)=1;$NF=l;print $0}' OFS=@ sample.txt >sample1.txt
3)将剩余信息追加到创建的正确行文件中
awk -F@ 'NR>1{print $0}' sample.txt >>sample1.txt
是否有awk,sed或Perl一个内衬(或管道组合)可以一次完成上述三个步骤?
如果我对您的理解正确,那么该程序将按照您的意愿进行
它从文件中读取前两行,并将第一行的后两个字段替换为1
,并将第二行的最后一个字段替换。 然后打印这两行并复制文件的其余部分
输入文件的路径应作为命令行上的参数使用
use strict;
use warnings 'all';
my $line1 = <>;
my $line2 = <>;
my ($val) = $line2 =~ /.+\@(.+)/;
$line1 =~ s/\@[^\@]*\@[^\@]*$/\@1 \@$val\n/;
print $line1;
print $line2;
print while <>;
5@Comedia @5@3@2@3@1/2 @3@1.6 @1@2 1/2@1 @4 3/4
3@Melanistic@3@4@2@4@1 1/2@4@2 3/4@3@5 @2 @4 3/4
2@Pure @4@5@5@5@3 1/2@5@4 3/4@5@8 @3 @6 1/2
4@Profit @2@2@1@2@1.6 @1@1.6 @2@2 1/2@4 @6 1/2
1@Whammy @1@1@1@1@1.6 @2@1.6 @4@5 1/2@5 @8 1/4
您可以将所有这三个命令合并在一行中。 如下所示:
LENGTH=$(cat sample.txt |awk -F@ 'NR==2{print $NF}') awk -F@ -v l="$length" 'NR==1{$(NF-1)=1;$NF=l;print $0}' OFS=@ sample.txt ; awk -F@ 'NR>1{print $0}' sample.txt
如果我对您的理解正确,那么这款awk班轮将按您的意愿进行!
awk -F@ -v OFS="@" 'NR==1{$12=$12-10; $13=$13-10 " 3/4";}{$11=$11" "; sub(" ", "", $12);}1'
输出:
5@Comedia @5@3@2@3@1/2 @3@1.6 @1@2 1/2 @1@4 3/4
3@Melanistic@3@4@2@4@1 1/2@4@2 3/4@3@5 @2@4 3/4
2@Pure @4@5@5@5@3 1/2@5@4 3/4@5@8 @3@6 1/2
4@Profit @2@2@1@2@1.6 @1@1.6 @2@2 1/2 @4@6 1/2
1@Whammy @1@1@1@1@1.6 @2@1.6 @4@5 1/2 @5@8 1/4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.