Анализировать файл csv, заменять разделитель, игнорируя содержимое полей между «»

POSIXly:

find . ! -name . -prune -type d ! -name '*)'

With zsh:

print -rl -- *[^\)](/)

Другие Bourne-подобные оболочки не имеют возможности фильтровать результат globbing. Вы можете использовать:

printf '%s\n' *[!\)]/

для поиска только каталогов. Но при этом к результату расширения будет добавлена косая черта. С каталогом foo вы получите foo/.

2
16.05.2019, 22:19
3 ответа

Я думал, что это будет легко сделать с помощью awk, но в итоге получилось что-то вроде беспорядка. Однако, поскольку я приложил усилия для ее решения, вот потенциальное решение с awk, которое использует функцию FPAT:

cat file.txt | awk -v FPAT='[^;]+|"[^"]+"' '{ for( col=1; col<=NF; col++ ) { printf "%s|", $col; } print "" }'

По сути, он использует регулярное выражение FPATдля определения того, что классифицируется как элемент (либо без точки с запятой, либо в кавычках ), и перепечатывает их с символом(|)между столбцами. Изначально я хотел использовать опцию OFS, но похоже, что она плохо сочетается с опцией FPAT

.
0
27.01.2020, 21:58

Изменение данных в полях небезопасно.

Для разбора CSV-файлов можно использоватьcsvtool

$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1- -
BARCELONA,,Country.666;53,15

или для отдельных полей

$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1,3 -
BARCELONA,Country.666;53    
1
27.01.2020, 21:58

Это можно сделать с помощью GNU sedредактора с включенными расширенными регулярными выражениями:

$ sed -Ee 's/(("[^"]*")+|[^;]+);/\1|/g' in.csv
0
27.01.2020, 21:58

Теги

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