Для этого вам понадобится цикл по файлам:
for file in *.txt; do
lines=$(wc -l < "$file")
if [ "$lines" -lt 3 ]; then
echo "$file is short enough, not touching it."
else
# for testing, you can also use the -i option
sed -n '1p;$p' "$file" > "$file.new"
fi
done
Цикл необходим, если у вас есть файлы длиной всего в одну строку. С командой , заданной thrig , они появятся дважды (попробуйте echo 1 | sed -n '1p; $ p'
).
Вы были довольно близко. Вы видите, что вы делали неправильно, не так ли? Вы сохраняли одну сумму для каждого значения столбца 1, когда вы должны были держать три.
Это похоже на ответ Иниана , но легко расширяется для обработки любого количества столбцов:
awk -F"\t" '{for(n=2;n<=NF; ++n) a[$1][n]+=$n}
END {for(i in a) {
printf "%s", i
for (n=2; n<=4; ++n) printf "\t%s", a[i][n]
printf "\n"
}
}'
Вместо того, чтобы хранить три массива, как в ответе Иниана, он хранит двумерный -массив.
Пока ваш файл разделен табуляцией -, для этого хорошо подходит datamash .
$ datamash groupby 1 sum 2 sum 3 sum 4 < tablefilepath
abc 1 1 1
bcd 14 25 7
cde 20 11 35
Datamash также может работать с вкладками, отличными от -, если вы укажете -t <delimiter>
. Но вкладки кажутся наиболее близкими к приведенному вами примеру ввода.
Datamash не будет работать, если ваш ввод разделен произвольным пробелом (т. е. возможными несколькими пробелами, предназначенными для того, чтобы «выглядеть» как вкладка ). Тем не менее, даже если ваши данные выглядят именно так, их легко преобразовать в форму, ожидаемую datamash :
.sed -i 's/ \+/\t/g' tablefilepath
Используя awk
суммируя столбцы 2 -4 на основе 1.
awk -v FS="\t" -v OFS="\t" '{ col1[$1]+=$2; col2[$1]+=$3; col3[$1]+=$4; next } END { for ( i in col1) print i, col1[i], col2[i], col3[i] }' file