Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Linux 如何在awk中附加特殊字符?_Linux_Shell_Awk - Fatal编程技术网

Linux 如何在awk中附加特殊字符?

Linux 如何在awk中附加特殊字符?,linux,shell,awk,Linux,Shell,Awk,我有三个不同列和行大小的文件。比如说, ifile1.txt ifile2.txt ifile3.txt 1 2 2 1 6 3 8 2 5 6 3 8 9 0 3 8 7 6 8 23 6 6 7 6 23 6 44 5

我有三个不同列和行大小的文件。比如说,

ifile1.txt        ifile2.txt        ifile3.txt
  1    2    2       1    6            3     8
  2    5    6       3    8            9     0
  3    8    7       6    8           23     6
  6    7    6      23    6           44     5
  9   87   87      44    7           56     7
 23    6    6      56    8           78    89
 44    5   76      99    0           95    65
 56    6    7                        99    78
 78    7    8                       106     0
 95    6    7                       110     6
 99    6    4                  
106    5   34                  
110    6    4                  

Here ifile1.txt has 3 coulmns and 13 rows, 
     ifile2.txt has 2 columns and 7 rows, 
     ifile3.txt has 2 columns and 10 rows.
     1st column of each ifile is the ID, 
     This ID is sometimes missing in ifile2.txt and ifile3.txt.
我想制作一个包含4列的outfile.txt,其第一列将具有ifile1.txt中的所有ID,而第二列将是ifile1.txt中的3美元,第三列和第四列将是ifile2.txt和ifile3.txt中的2美元,ifile2.txt和ifile3.txt中缺失的站将被指定为一个特殊字符“?”

期望输出:

outfile.txt
  1     2     6     ?
  2     6     ?     ?
  3     7     8     8
  6     6     8     ?
  9    87     ?     0
 23     6     6     6
 44    76     7     5
 56     7     8     7
 78     8     ?    89
 95     7     ?    65
 99     4     0    78
106    34     ?     0
110     4     ?     6
我尝试使用以下算法,但无法编写脚本

for each i in $1, awk '{printf "%3s %3s %3s %3s\n", $1, $3 (from ifile1.txt), 
check if i is present in $1 (ifile2.txt), then
           write corresponding $2 values from ifile2.txt
      else write ?
similarly check for ifile3.txt

您可以使用以下脚本使用GNU AWK执行此操作:

script.awk

# read lines from the three files 
ARGIND == 1 { file1[ $1 ] = $3
              # init the other files with ?
              file2[ $1 ] = "?"
              file3[ $1 ] = "?"
              next;
            }

ARGIND == 2 { file2[ $1 ] = $2
              next;
            }

ARGIND == 3 { file3[ $1 ] = $2
              next;
            }

# output the collected information
END         { for( k in file1) { 
                printf("%3s%6s%6s%6s\n", k, file1[ k ], file2[ k ], file3[ k ])
              }
            }

像这样运行脚本:
awk-f script.awk-ifile1.txt-ifile2.txt-ifile3.txt>outfile.txt

为了测试一个潜在的解决方案,我们必须手动分离什么;您的问题是创建3个输入文件。我怀疑是否有很多人会费心这么做-你的问题是将3个输入文件分开显示,而不是粘贴在一起,这样对我们来说比较容易,所以我们更有可能帮助你。使每个文件大约3-5行,每个文件中不需要10+行样本输入。