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