Как мне написать сценарий bash для сравнения и вывода значений в любых файлах .txt в том же формате? - PullRequest
0 голосов
/ 14 июля 2020

Как мне написать сценарий bash для сравнения любого файла .txt с форматом SAME , который я указал ниже, и вывести их с помощью grep?

первый столбец - это связка ID, каждый из которых имеет оценку 1 или 0. ID 123 имеет 2 попытки, поэтому я делю более 6 вместо 3.

Обратите внимание, я не обязательно сравниваю file1.txt с file2.txt . Представьте, что существует больше файлов .txt с этим форматом, что вы пытаетесь найти среднее значение различных идентификаторов (некоторые из них находятся в нескольких файлах, например, 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

1 Ответ

1 голос
/ 15 июля 2020
#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...