Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
如何编写bash脚本来比较和输出任何具有相同格式的.txt文件中的值?_Bash_Shell_Compare - Fatal编程技术网

如何编写bash脚本来比较和输出任何具有相同格式的.txt文件中的值?

如何编写bash脚本来比较和输出任何具有相同格式的.txt文件中的值?,bash,shell,compare,Bash,Shell,Compare,我如何编写bash脚本来比较任何.txt文件的格式与下面列出的格式相同,并使用grep输出它们 第一列是一组ID,每个ID的得分为1或0。ID123有两次尝试,这就是为什么我除以6而不是3 请注意,我并不一定要比较file1.txt和file2.txt。假设有更多使用此格式的.txt文件,您正在尝试查找不同ID的平均值(一些文件位于多个文件中,例如ID 123) file1.txt CourseA 123 1 1 1 456 1 0 1 789 0 0 0 file2.txt C

我如何编写bash脚本来比较任何.txt文件的格式与下面列出的格式相同,并使用grep输出它们

第一列是一组ID,每个ID的得分为1或0。ID123有两次尝试,这就是为什么我除以6而不是3

请注意,我并不一定要比较file1.txt和file2.txt。假设有更多使用此格式的.txt文件,您正在尝试查找不同ID的平均值(一些文件位于多个文件中,例如ID 123)

file1.txt

CourseA

123   1 1 1
456   1 0 1
789   0 0 0
file2.txt

CourseB

123   1 0 1
233   0 1 0
423   0 0 1
我的期望输出

ID     CourseA    CourseB     AVG
123      3/3        2/3       5/6
456      2/3         -        2/3
789      0/3         -        0/3
233       -         1/3       1/3
423       -         1/3       1/3

使用
awk
执行此操作。使用每个课程的所有数据创建关联数组。最后,通过数组循环组合数据并计算平均值。使用Python这样的更好的语言,使用pandas这样的库,这可能会更容易。@Barmar您知道使用grep做这件事的方法吗?我只是在尝试学习,因为我最近刚开始学习,还没有开始学习awk。我正在努力熟悉基本知识。即使这样,我也不知道如何使用awk。这不能用
grep
来完成。它只打印匹配的行,无法重新组织或执行计算。您需要将所有ID放入一个数组中。然后,您可以在数组中循环并搜索所有文件中的匹配项以计算平均值。仅用于单词和文件名,不带空格谢谢代码。但是,我得到了这个错误233 a:line 36:printf:-\:无效选项printf:usage:printf[-v var]format[arguments]在大多数情况下,您的代码对我来说是有意义的。它非常接近我想要的,除了我提到的那个错误。因为无法访问PC,所以只能在android busybox上测试。将该行替换为
printf“%s\t”“-”
您提到的它只适用于没有空格的单词,让我们假设我将CourseA切换到CourseA或CourseA:Section A。从您的代码来看,它显然不起作用。我会用cut,但它会把空间搞得一团糟。另外,如果我想在的.txt文件中添加另一行,比如说,course worth,我该如何更改平均值。课程A后面的下一行值为-2,课程B后面的行值为-1。例如,ID123在航向a中有3/3,在航向B中有2/3。但是航向a现在价值加倍,因此它将影响平均值,因为它具有更大的重量。
#!/bin/bash

file='./file*.txt'

# list of headers
columns=$(head -qn1 $file | grep -oE '^\S+' | sort | uniq)

# list of items
items=$(tail -qn+2 $file | grep -oE '^\S+' | sort | uniq)

# print table header
echo "ID\t${columns//$'\n'/$'\t'}\tAVG"

# generate table sequencial
for item in $items
  do
    unset i j
    # summate values overall files
    for n in $(grep -h ^$item $file | grep -oE '(\s+[0-9]+)')
      do
        i=$((i+n))
        j=$((j+1))
    done

    # print next line
    printf "%s\t" $item

    # print columns
    for column in $columns
      do
        # query all files for columns
        grep -q ^$column $(grep -l ^$item $file)
        if [ $? != 0 ]
          then
            # item does not exist in this file
            printf "-\t"
          else
            # print values for column
            printf "%d %d %d\t" $(grep -h ^$item $(grep -l ^$column $file) | grep -oE '(\s+[0-9]+\s+[0-9]+\s+[0-9]+)')
        fi
    done

    # print sum
    printf "%d/%d\n" $i $j
done