连接列和添加数字 awk

问题描述 投票:0回答:2

我有一个csv文件。

number1;number2;min_length;max_length
"40";"1801";8;8  
"40";"182";8;8  
"42";"32";6;8  
"42";"4";6;6  
"43";"691";9;9  

我想输出的是:

4018010000;4018019999  
4018200000;4018299999  
42320000;42329999
423200000;423299999
4232000000;4232999999
42400000;42499999  
43691000000;43691999999  

所以新文件将由以下内容组成:

column_1 = old_column_1 + old_column_2 + 一个 "0 "的数字的连词,等于(old_column_3 - old_column_2的长度)

column_2 = old_column_1 + old_column_2 + "9 "的连号,等于(old_column_3 - old_column_2的长度) ,当min_length = max_length。当min_length不等于max_length时,我需要考虑所有可能的长度。所以对于 "42"; "32";6;8这一行,所有的长度都是:6,7和8。6,7和8。

另外,我需要删除所有的引号。

我试过用粘贴和剪切这样的方法。

paste -d ";" <(cut -f1,2 -d ";" < file1) > file2

但我觉得用awk更容易。但是,我不知道怎么做。任何帮助,它的感激。谢谢你的帮助

编辑:其实,在输入中添加了第4列。

awk add concat cut
2个回答
3
投票

你可以使用这个 awk:

awk 'function padstr(ch, len, s) {
   s = sprintf("%*s", len, "")
   gsub(/ /, ch, s)
   return s
}
BEGIN {
   FS=OFS=";"
}
{
   gsub(/"/, "");
   for (i=0; i<=($4-$3); i++) {
      d = $3 - length($2) + i
      print $1 $2 padstr("0", d), $1 $2 padstr("9", d)
   }
}' file

4018010000;4018019999
4018200000;4018299999
42320000;42329999
423200000;423299999
4232000000;4232999999
42400000;42499999
43691000000;43691999999

1
投票

有awk。

awk '
    BEGIN{FS = OFS = ";"}  # set field separator and output field separator to be ";"
    {
        $0 = gensub("\"", "", "g"); # Drop double quotes
        s = $1$2; # The range header number
        l = $3-length($2); # Number of zeros or 9s to be appended
        l = 10^l; # Get 10 raised to that number
        print s*l, (s+1)*l-1; # Adding n zeros is multiplication by 10^n
                              # Adding n nines is multipliaction by 10^n + (10^n - 1)
    }' input.txt

解释以注释形式插入。

© www.soinside.com 2019 - 2024. All rights reserved.