У меня есть текстовый файл разделен так:
field1,field2,field3
xield1,xield2,xield3
dield1,dield2,dield3
gield1,gield2,gield3
Каждый из этих столбцов будет параметром программы, и я хотел бы, чтобы программа вызывалась для каждой строки.
Я надеялся на цикл, что-то вроде:
for $i in file
command $field2 -x $field3 -PN -$field1 >> output
done
Каков наилучший способ сделать что-то подобное в bash?
bash
text-processing
scripting
csv
декан
источник
источник
Ответы:
Это должно работать, если количество полей постоянное. Вместо того, чтобы
echo
использовать вашу команду.источник
Вы должны использовать
while
соread
встроенным:Как это работает
cut
Оператор принимает строку и разбивает ее на ограничителе , указанного-d
.--output-delimiter
-разделитель, которыйcut
будет использоваться для отображения выбранных полей, здесь мы выбираем пробел, чтобы мы могли поместить различные поля в массивfields
.-f1-
вступает в игру.fields
, вы можете получить доступ к любой конкретной области вы хотите с синтаксисом ,${field[number]}
гдеnumber
один меньше , чем фактическое количество поля вы хотите , так как индексация массива начинается с нуля в Bash.Заметка
Для постоянного количества полей
Вместо этого вы можете сделать что-то похожее на ответ 1_CR :
Вышеуказанное, хотя и выглядит более шумно, должно работать в любой POSIX-совместимой оболочке, а не только в Bash.
источник
IFS
соответствующее значение вread
вызовеВы можете
read
разбить каждую строку на массив,
, установивIFS
соответствующим образом.Таким образом, в приведенном выше примере вы можете получить доступ к каждому элементу массива, используя его индекс, начиная с 0.
источник
Этот
awk
однострочник будет делать то, что вы хотите:Замените его
echo
командой иf.txt
файлом, который вы хотите перебрать.Краткое объяснение:
-F,
будет установлен,
в качестве разделителя.cmd
строит команду иsystem(cmd)
вызывает команду.источник
Также можно использовать GNU SED.
обратите внимание на использование опции e для команды s
источник