Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Unix中粘贴具有不等行和多列的文件_Unix_Awk_Paste - Fatal编程技术网

在Unix中粘贴具有不等行和多列的文件

在Unix中粘贴具有不等行和多列的文件,unix,awk,paste,Unix,Awk,Paste,假设我有三个文件,内容如下: 文件1: AAA BBB CCC 123 563 2467 文件2: NA NA NA 文件3: DDD EEE FFF 2333 236 908 123 376 887 我要粘贴这些文件并为空字段插入0,如下所示: AAA BBB CCC NA NA NA DDD EEE FFF 123

假设我有三个文件,内容如下:

文件1:

AAA     BBB     CCC
123     563     2467
文件2:

NA      NA      NA
文件3:

DDD     EEE     FFF
2333    236     908
123     376     887
我要粘贴这些文件并为空字段插入0,如下所示:

AAA     BBB     CCC     NA      NA      NA      DDD     EEE     FFF
123     563     2467    0       0       0       2333    236     908
0       0       0       0       0       0       123     376     887
我甚至无法通过粘贴的第一步。当我尝试粘贴文件1文件2文件3时,它变得像:

AAA BBB CCC NA  NA  NA  DDD EEE FFF
123 563 2467        2333    236 908
        123 376 887
虽然我发现
pr-m-tfile1file2file3可以工作,但它不显示完整字符串,因为我有一些长字符串


在这种情况下,我如何让它工作?提前感谢。

您可以使用GNU awk(修改自。请注意订购部分):


您可以使用GNU awk(修改自。请注意订购部分):


你能试试下面的吗。这看起来更健壮,下面是这一个的优点

  • 如果没有GNU
    awk
    ,它也应该可以工作(尽管我不能在所有版本上进行测试)
  • 它将查找所有传递的输入_文件中的最大行数,并根据该空行中的最大字段数打印零
  • 它还将查看是否有一行(第一个输入_文件中的第二行和第二个输入_文件中的第二行),如果它们的字段数较少,它也将向该行添加剩余的数字字段(简单地追加)

awk'
FNR==1{
总计字段=总计字段>NF?总计字段:NF
++文件
}
{
文件行[文件]++
a[FNR,文件]=$0
}
结束{
用于(文件行中的i){
val=val>文件行[i]?val:文件行[i]
}

对于(i=1;i你能试试下面的吗?这个看起来更坚固,下面是这个的优点

  • 如果没有GNU
    awk
    ,它也应该可以工作(尽管我不能在所有版本上进行测试)
  • 它将查找所有传递的输入_文件中的最大行数,并根据该空行中的最大字段数打印零
  • 它还将查看是否有一行(第一个输入_文件中的第二行和第二个输入_文件中的第二行),如果它们的字段数较少,它也将向该行添加剩余的数字字段(简单地追加)

awk'
FNR==1{
总计字段=总计字段>NF?总计字段:NF
++文件
}
{
文件行[文件]++
a[FNR,文件]=$0
}
结束{
用于(文件行中的i){
val=val>文件行[i]?val:文件行[i]
}

对于(i=1;i,这里是另一种方法

$ paste -d~ file1 file2 file3 | 
  awk -F~ '{$1=$1; for(i=1;i<=NF;i++) if($i=="") $i=nvl[i]}1
     NR==1 {for(i=1;i<=NF;i++) {gsub(/[^ ]+/,0,$i); nvl[i]=$i}}' | column -t


AAA  BBB  CCC   NA  NA  NA  DDD   EEE  FFF
123  563  2467  0   0   0   2333  236  908
0    0    0     0   0   0   123   376  887

这是另一种方法

$ paste -d~ file1 file2 file3 | 
  awk -F~ '{$1=$1; for(i=1;i<=NF;i++) if($i=="") $i=nvl[i]}1
     NR==1 {for(i=1;i<=NF;i++) {gsub(/[^ ]+/,0,$i); nvl[i]=$i}}' | column -t


AAA  BBB  CCC   NA  NA  NA  DDD   EEE  FFF
123  563  2467  0   0   0   2333  236  908
0    0    0     0   0   0   123   376  887

由于我正在用空格inits值替换新插入的
0
,因此可能会影响OP的数据(如果存在任何0),所以正在进行修复。好的,我现在已经修复了这个零问题,用其他几个示例进行了测试,现在看起来不错,干杯。因为我正在用空格inits值替换新插入的
0
,它可能会影响OP的数据(如果有任何0),所以正在进行修复。好的,我现在已经修复了这个零问题,使用了一些其他示例进行了测试,现在看起来很好,干杯。请检查解决方案并让我们知道这些是否对您有帮助?请检查解决方案并让我们知道这些是否对您有帮助?
awk '
FNR==1{
  total_fields=total_fields>NF?total_fields:NF
  ++file
}
{
  file_lines[file]++
  a[FNR,file]=$0
}
END{
  for(i in file_lines){
     val=val>file_lines[i]?val:file_lines[i]
  }
  for(i=1;i<=val;i++){
     for(j=1;j<=file;j++){
       num=split(a[i,j],array," ")
       if(num<total_fields){
          new_val=sprintf("%0"total_fields-num"d","")
          ##printf "....... "total_fields-num">>>>"new_val" "
          gsub(/0/,"0 ",new_val)
          a[i,j]=(a[i,j]?a[i,j] OFS:"")new_val
          new_val=""
       }
       if(!a[i,j]){
          a[i,j]=sprintf("%0"total_fields"d",a[i,j])
          gsub(/0/,"0 ",a[i,j])
       }
       printf("%s%s",a[i,j],j==file?ORS:OFS)
       new_val=""
     }
  }
}
'   file1  file2  file3  |  column -t
$ paste -d~ file1 file2 file3 | 
  awk -F~ '{$1=$1; for(i=1;i<=NF;i++) if($i=="") $i=nvl[i]}1
     NR==1 {for(i=1;i<=NF;i++) {gsub(/[^ ]+/,0,$i); nvl[i]=$i}}' | column -t


AAA  BBB  CCC   NA  NA  NA  DDD   EEE  FFF
123  563  2467  0   0   0   2333  236  908
0    0    0     0   0   0   123   376  887
$ pr -Jmt file{1..3}