连接列并添加数字awk

连接列并添加数字awk,awk,add,concat,cut,Awk,Add,Concat,Cut,我有一个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 4

我有一个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  
因此,新文件将包括:

列\ 1=旧列\ 1+旧列\ 2+数字的串联 “0”的长度等于(旧_列_3-旧_列_2的长度)

column_2=旧_column_1+旧_column_2+等于9的数字的串联 to(old_column_3-old_column_2的长度),当min_length=max_length时。当min_长度不等于max_长度时,我需要考虑所有可能的长度。“42”行也是如此;"32";6.8,所有长度为:6、7和8

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

我试着用浆糊,然后像那样剪切:

paste -d ";" <(cut -f1,2 -d ";" < file1) > file2
粘贴-d”;“文件2
对于前两列的连接,但我认为使用awk更容易。然而,我不知道怎么做。谢谢你的帮助。谢谢


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

您可以使用此
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

您可以使用此
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
使用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
解释内联为注释。

带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

解释以注释形式内联。

欢迎来到SO,特别感谢您在帖子中展示了您的所有努力。但是您获得预期输出的逻辑不清楚,请您添加更多详细信息,然后让我们知道。欢迎访问SO,特别感谢您在帖子中展示了您的所有努力。但是您获得预期输出的逻辑不清楚,请您添加更多细节,然后让我们知道。我想您是指
awk'函数padstr(ch,len){
而不是
awk'函数padstr(ch,len,s){
@anishsane:这实际上是
awk
中的一项工作,以确保函数中使用的变量
s
保持函数的局部性。@anubhava,非常感谢!这很有效!我想我应该考虑另一列。我编辑了我的输入文件。我一直认为min_len=max_len,但似乎我错了.所以我需要考虑从min_length到max_length的所有可能长度。嗯。我猜是这样的。但是我不知道在调用过程中不传递第三个参数是否被接受。我已经测试过了,这工作正常。非常感谢!我真的很感激!我想你的意思是
awk'函数padstr(ch,len){
代替
awk'函数padstr(ch,len,s){
@anishsane:这实际上是
awk
中的一项工作,以确保函数中使用的变量
s
保持函数的局部性。@anubhava,非常感谢!这很有效!我想我应该考虑另一列。我编辑了我的输入文件。我一直认为min_len=max_len,但似乎我错了.所以我需要考虑所有可能的长度,从min_length到max_length.Hmm.我猜是这样的。但是我不知道在调用过程中不传递第三个参数是否被接受。我进行了测试,结果正如预期的那样。非常感谢!我真的很感激!谢谢,这很有效,但我发现我需要考虑第4列。thank,这是可行的,但我发现我需要考虑第4列。