Чтение и запись в файловую систему может включают большое количество схем буферизации, обслуживание ОС, низкоуровневое управление дисками и множество других возможных действий. Таким образом, действия open ()
и close ()
служат в качестве настройки для этих типов скрытых действий. Различные реализации файловой системы могут быть настроены по мере необходимости и при этом оставаться прозрачными для вызывающей программы.
Если ОС не открывала / закрывала, то с помощью чтения
или записи
эти действия с файлом все равно должны были бы выполнять любые инициализации, очистку / управление буфером и т. Д. каждый раз. Это накладные расходы на повторяющиеся операции чтения и записи.
Использование cvscut
из набора инструментовcsvkit
:
$ csvcut -q "'" -c 5,6 file.csv
",",jkk
",",rgr
rgr,rgr
-q "'"
необходимо, чтобы сообщить csvcut
, что в данных используется нестандартный -символ кавычек (одинарная кавычка ). -c 5,6
извлекает столбцы пять и шесть. На выходе будет правильно отформатированный CSV-документ.
Чтобы получить только пятый столбец без добавления кавычек:
$ csvcut -q "'" -c 5 file.csv | csvformat -T
,
,
rgr
Это передает вывод с csvcut
по csvformat
и запрашивает использование табуляции для разделителя вывода вместо запятых. Поскольку в данных нет вкладок, данные больше не нужно заключать в кавычки.
Это также, очевидно, работает для получения нескольких столбцов в формате табуляции -с разделителями:
$ csvcut -q "'" -c 5,6 file.csv | csvformat -T
, jkk
, rgr
rgr rgr
Он также работает для преобразования всех данных, разделенных запятыми -, в данные, разделенные табуляцией -:
.$ csvformat -q "'" -T file.csv
abv sfs hju , jkk
wff fst rgr , rgr
ere edf erg , rgr rgr
Разделение данных на вкладке -упрощает работу с ними с помощью стандартных инструментов Unix:
$ csvformat -q "'" -T file.csv | cut -f 5,6
, jkk
, rgr
rgr rgr
Следующее воспроизводит ожидаемый результат:
$ csvformat -q "'" -T file.csv | awk -F '\t' '{ print $5; print $6 }'
,
jkk
,
rgr
rgr
rgr
(Обратите внимание, что ожидаемый вывод в вопросе содержит неожиданную запятую, которая, как я предполагаю, происходит из столбца четыре в последней строке. Его там быть не должно.)
Для более сложного синтаксического анализа рассмотрите другой язык сценариев, например Python или Perl.
Модуль Text::CVS
в Perl обеспечивает легкий доступ к данным CSV. Нижеследующее просто показывает, что довольно легко прочитать полный файл в массив массивов в Perl:
$ perl -MData::Dumper -MText::CSV=csv -e '$c = csv(in=>"file.csv",quote_char=>"\x27");print Dumper($c)'
$VAR1 = [
[
'abv',
'sfs',
'',
'hju',
',',
'jkk'
],
[
'wff',
'fst',
'',
'rgr',
',',
'rgr'
],
[
'ere',
'edf',
'erg',
',',
'rgr',
'rgr'
]
];
С фрезой
<input sed "s/'/\"/g" | mlr --c2x --implicit-csv-header cut -f 5,6 | \
grep -v "^$" | cut -d " " -f 2
дает вам
,
jkk
,
rgr
rgr
rgr
Это не awk, это Miller — отличный инструмент для структурированного текста(http://johnkerl.org/miller/doc/).