Вероятно, это невозможно с sed. Я делаю с AWK. Я предполагаю одну запись в строке.
awk '
BEGIN { FS="-"; ORS=""; left="" }
{
if(NR>1){print "&"}
# Only print left part if it differs from previous line
if ($1!=left) {
print $1 "-" $2
left=$1;
} else {
print "-" $2
}
}' inputfile.txt
Выходы 4480-1 & -2 & -3 & -15 & 4581-1 & -2 & -3 & -4
Команда read
может захватывать несколько слов, разделенных символами в $ IFS
(по умолчанию: пробел, табуляция , новая строка)
while read -r d1 d2 d3 d4; do
rectang -cs "$d1" "$d2" "$d3" "$d4"
done < file.csv
Учитывая ваши измененные данные (поля, разделенные запятыми и пробелами), я бы сделал следующее:
while IFS=",$IFS" read -r d1 d2 d3 d4; do # ...
, чтобы включить запятую в качестве разделителя полей.
Если файл такой:
cat table.txt | while read i
do
rectang -cs $i
done
Это вызовет:
rectang -cs 5 6 9 5
rectang -cs 2 8 1 1
и т. Д.
Ответ Гленна, конечно, очень хорош, но в таких случаях я бы использовал awk
для генерации командных строк, а затем передать результаты в оболочку. Поскольку awk
является частью POSIX, это, вероятно, будет правильным решением.
awk -F'[, ]+' '{print "rectang -cs", $1, $2, $3, $4}' table.csv | sh
или присвоение первого поля первому полю, чтобы запустить повторное вычисление разделителя полей:
awk -F'[, ]+' '$1=$1{print "rectang -cs", $0}' table.csv | sh
В качестве альтернативы, с аналогичным шаблоном:
sed -e 's/^/rectang -cs /' -e 's/, */ /g' table.csv | sh
Конечно, во время экспериментов вы можете просто посмотреть на команды и только если вы действительно уверены, вы отправляете его на sh
.