簡體   English   中英

從數據聲明變量,並在一行代碼中對數據運行多個命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM