Чтение ячеек в файле csv

Вероятно, это невозможно с 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

1
31.08.2015, 23:10
3 ответа

Команда 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 # ...

, чтобы включить запятую в качестве разделителя полей.

1
27.01.2020, 23:49

Если файл такой:

cat table.txt | while read i
do
    rectang -cs  $i
done

Это вызовет:

rectang -cs 5  6  9  5
rectang -cs 2  8  1  1 

и т. Д.

0
27.01.2020, 23:49

Ответ Гленна, конечно, очень хорош, но в таких случаях я бы использовал 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 .

0
27.01.2020, 23:49

Теги

Похожие вопросы