Используйте sed
, швейцарский армейский нож для обработки текста:
sed 's/\.xml.*//' File
$ paste a.csv b.csv | awk -F '\t' 'NR > 1 { ++cmp[$1>$2 ? 1 : $1==$2 ? 0 : -1] } END { printf "greater\t= %d\nsmaller\t= %d\nequal\t= %d\n", cmp[1],cmp[-1],cmp[0] }'
greater = 2
smaller = 2
equal = 1
Это создает ввод из двух -столбцов для короткой awk
программы с использованием paste
. Содержимое a.csv
будет в первом поле, а содержимое b.csv
будет во втором поле, а между ними будет символ табуляции в -.
Строка заголовка отбрасывается, и первый блок кода увеличивает один из трех счетчиков в массиве cmp
. Значение cmp[1]
увеличивается, если первое поле(a.csv
)больше второго поля (b.csv
). Значение cmp[0]
увеличивается, если два поля равны. Значение cmp[-1]
увеличивается, если второе поле больше первого.
В конце в блоке END
печатаются результаты.
То же самое в Perl, используя его оператор космического корабля<=>
:
$ paste a.csv b.csv | perl -a -F'\t' -e '$. > 1 && ++$cmp{$F[0] <=> $F[1]}; END { printf "greater\t= %d\nsmaller\t= %d\nequal\t= %d\n", $cmp{1},$cmp{-1},$cmp{0} }'
greater = 2
smaller = 2
equal = 1
$.
в Perl более или менее совпадает с NR
в awk
, поэтому $. > 1
пропускает строку заголовка во входных данных. Если вы использовали -MEnglish
, вы можете изменить $.
на $NR
.
Использование любого awk в любой оболочке на каждом компьютере Unix:
$ cat tst.awk
FNR==1 { next }
NR==FNR {
v[FNR] = $1
next
}
{
if ( v[FNR] > $1 ) { gt++ }
else if ( v[FNR] < $1 ) { lt++ }
else { eq++ }
}
END {
tot = gt + lt + eq
printf "%s is greater than %s in %d/%d cases.\n", ARGV[1], ARGV[2], gt, tot
printf "%s is smaller than %s in %d/%d cases.\n", ARGV[1], ARGV[2], lt, tot
printf "%s is equal to %s in %d/%d cases.\n", ARGV[1], ARGV[2], eq, tot
}
$ awk -f tst.awk a.csv b.csv
a.csv is greater than b.csv in 2/5 cases.
a.csv is smaller than b.csv in 2/5 cases.
a.csv is equal to b.csv in 1/5 cases.