Shell 使用awk时,在不考虑缺失值的情况下,最多可存储多个文件

Shell 使用awk时,在不考虑缺失值的情况下,最多可存储多个文件,shell,awk,max,Shell,Awk,Max,我想计算最多15个文件:-ifile1.txt,ifile2.txt,…,ifile15.txt。每个文件的列数和行数相同。但其中一些缺少价值观。部分数据看起来像 ifile1.txt ifile2.txt ifile3.txt 3 ? ? ? . 1 2 1 3 . 4 ? ? ? . 1 ? ? ? . 1 ? ? ? . 5 ? ? ? . 4 6 5 2 . 2 5 5 1 .

我想计算最多15个文件:-ifile1.txt,ifile2.txt,…,ifile15.txt。每个文件的列数和行数相同。但其中一些缺少价值观。部分数据看起来像

 ifile1.txt      ifile2.txt       ifile3.txt
 3  ?  ?  ? .    1  2  1  3 .    4  ?  ?  ? .
 1  ?  ?  ? .    1  ?  ?  ? .    5  ?  ?  ? .
 4  6  5  2 .    2  5  5  1 .    3  4  3  1 .
 5  5  7  1 .    0  0  1  1 .    4  3  4  0 .
 .  .  .  . .    .  .  .  . .    .  .  .  . .  
我想写这15个文件的最大值,而不考虑缺少的值

 ofile.txt
 4   2  1  3  . (i.e. max of 3 1 4, max of ? 2 ? and so on)
 5   ?  ?  ?  .
 4   6  5  2  .
 5   5  7  4  .
 .   .  .  .  .
我正在尝试这个,但没有得到结果

awk '
  {
   for( i = 1; i <= FNR; i++){
      for( j = 1; j <= NF; j++) printf "%s ", {
    max=="" || $i > max {max=$i} END{ print max}' FS="|" : "?"
      print ""
      }
   }
' ifile*
awk'
{

对于(i=1;i您可以尝试此
awk
程序:

awk '{
  for(i=1;i<=NF;i++)
    if($i>a[FNR,i] && $i!="?")
      a[FNR,i]=$i
}
END{
  for(j=1;j<=FNR;j++)
    for(i=1;i<=NF;i++)
      printf "%s%s",(a[j,i]?a[j,i]:"?"),(i<NF?OFS:ORS)
}' file1 file2 file3
4 2 1 3
5 ? ? ?
4 6 5 2
5 5 7 1
awk'{
对于(i=1;ia[FNR,i]&&&$i!=“?”)
a[FNR,i]=$i
}
结束{

对于(j=1;j您可以尝试此
awk
程序:

awk '{
  for(i=1;i<=NF;i++)
    if($i>a[FNR,i] && $i!="?")
      a[FNR,i]=$i
}
END{
  for(j=1;j<=FNR;j++)
    for(i=1;i<=NF;i++)
      printf "%s%s",(a[j,i]?a[j,i]:"?"),(i<NF?OFS:ORS)
}' file1 file2 file3
4 2 1 3
5 ? ? ?
4 6 5 2
5 5 7 1
awk'{
对于(i=1;ia[FNR,i]&&&$i!=“?”)
a[FNR,i]=$i
}
结束{

对于(j=1;j占用一些内存,但每个文件仅占用1个循环

awk '{L=FNR==1?"":L ORS;for (i=1;i<=NF;i++){R=FNR":"i; M[R]=M[R]*1<=$i*1?$i:M[R];L=L OFS M[R]}}END{print L}' ifile*

awk'{L=FNR==1?”:L个ORS;for(i=1;i占用一些内存,但每个文件只占用1个循环

awk '{L=FNR==1?"":L ORS;for (i=1;i<=NF;i++){R=FNR":"i; M[R]=M[R]*1<=$i*1?$i:M[R];L=L OFS M[R]}}END{print L}' ifile*

awk'{L=FNR==1?”:用于(i=1;i通过将这些
放在您的输入和输出示例中,您为我们创建了工作,因为我们将不得不删除这些点来创建一些我们可以测试可能解决方案的东西。不要这样做-让人们尽可能容易地帮助您。非常感谢@EdMorton..我没有意识到…通过将这些
放在在您的输入和输出示例中,您为我们创建了工作,因为我们必须删除这些点来创建我们可以测试可能的解决方案的东西。不要这样做-让人们尽可能容易地帮助您。非常感谢@EdMorton..我没有意识到…
a[I,j]?a[I,j]:“?”
应该是a[I,j]中的
(I,j):“?”
。如前所述,您将把
0
的值更改为
。您应该始终在三元表达式周围加上括号,因为它们在某些上下文中会产生语法错误,否则-
((i,j)在a?a[i,j]:?)
。同样,您将在每行末尾添加一个空白字符,这通常是不需要的。只需测试最后一个字段,添加适当的字符,并使用ORS,而不是硬编码您认为ORS将具有的值(
“\n”
)。因此,您实际上应该将最后两行printf替换为这一行:
printf“%s%s”,((i,j)在a?a[i,j]:“?”)中,(i@EdMorton非常感谢您的评论。我完全同意您的第二条评论。我也同意第一条评论,但在这种情况下,我会对数组内容而不是数组索引(
(I,j)进行测试由于某种原因,主循环中的
if
正在分配索引,使得打印不正确。对于我来说,奇怪的
awk
行为,我可以用
awk'开始复制{if(a[1,1]啊,对。
$I>a[FNR,I]
正在创建
a[FNR,I]=零或空
-考虑到您以后的测试从
a[FNR,I]开始的更改
to
a[FNR,i]!=”
将该情况与您从输入中填充
0
的情况区分开来。
a[i,j]?a[i,j]:“?”
应该是a[i,j]中的
(i,j):“?“
。如前所述,您将把
0
的值更改为
。顺便说一句,您应该在三元表达式周围加上括号,因为它们在某些上下文中会产生语法错误,否则-
((i,j)在a?a[i,j]:?”)
。同样,您将在每行末尾添加一个空白字符,这通常是不需要的。只需测试最后一个字段,添加适当的字符,并使用ORS,而不是硬编码您认为ORS将具有的值(
“\n”
)。因此,您实际上应该将最后两行printf替换为这一行:
printf“%s%s”,((i,j)在a?a[i,j]:“?”)中,(i@EdMorton非常感谢您的评论。我完全同意您的第二条评论。我也同意第一条评论,但在这种情况下,我会对数组内容而不是数组索引(
(I,j)进行测试由于某种原因,主循环中的
if
正在分配索引,使得打印不正确。对于我来说,奇怪的
awk
行为,我可以用
awk'开始复制{if(a[1,1]啊,对。
$I>a[FNR,I]
正在创建
a[FNR,I]=零或空
-考虑到您以后的测试从
a[FNR,I]开始的更改
a[FNR,i]!=”
以区分该情况与使用输入的
0
填充该情况。