Ubuntu 16.04
Баш 4.3.3
Мне также нужен способ добавить пробел после запятой, если его нет в 6-м столбце. Мне пришлось прокомментировать приведенную выше строку, потому что она ставила пробел после всех запятых в файле csv.
Неправильный:"This is 6th column,Hey guys,Red White & Blue,I know it,Right On"
Идеально:"This is 6th column, Hey guys, Red White & Blue, I know it, Right On"
Я почти мог видеть, как awk
распечатывает 6-й столбец, а sed
делает все остальное:
awk '{ print $6 }' "$feed " | sed -i 's/|/,/g; s/,/, /g; s/,\s\+/, /g'
Вот что у меня есть на данный момент:
for feed in *; do
sed -r -i 's/([^,]{0,10})[^,]*/\1/5' "$feed"
sed -i '
s/<b>//g; s/*//g;
s/\([0-9]\)""/\1inch/g;
# s/|/,/g; s/,/, /g; s/,\s\+/, /g;
s/"one","drive"/"onetext","drive"/;
s/"comments"/"description"/;
s/"features"/"optiontext"/;
' "$feed"
done
s/|/,/g; s/,/, /g; s/,\s\+/, /g;
работает, но является глобальным, а не внутри столбца.
Почему не awk '{ print $6 }' "$feed " | sed 's/, */, /g'
? Что делает |
? А все остальные заменители?
Похоже, все, что вам нужно, это (используя GNU awk для FPAT):
awk 'BEGIN{FPAT = "[^,]*|\"[^\"]+\""; OFS = ","} {gsub(/, ?/,", ",$6)} 1'
например.:
$ cat file
1,2,3,4,5,"This is 6th column,Hey guys,Red White & Blue,I know it,Right On",7,8
$ awk 'BEGIN{FPAT = "[^,]*|\"[^\"]+\""; OFS = ","} {gsub(/, ?/,", ",$6)} 1' file
1,2,3,4,5,"This is 6th column, Hey guys, Red White & Blue, I know it, Right On",7,8
На самом деле похоже, что весь ваш сценарий оболочки, включая несколько вызовов GNU sed, можно было бы сделать гораздо более эффективно всего за один вызов GNU awk без необходимости в окружающем цикле оболочки, например (не проверено):
awk -i inplace '
BEGIN{FPAT = "[^,]*|\"[^\"]+\""; OFS = ","}
{
$0 = gensub(/([^,]{0,10})[^,]*/,"\\1",5)
$0 = gensub(/([0-9])""/,"\\1inch","g")
sub(/"one","drive"/,"\"onetext\",\"drive\"")
sub(/"comments"/,"\"description\"")
sub(/"features"/,"\"optiontext\"")
gsub(/, ?/,", ",$6)
}
' *
но, если ввод содержит пустые поля, FPAT
не сработает, верно?
@oguzismail. Нет. Первая часть FPAT
допускает пустые поля.
@ed, это хорошо сработало с тем, что у вас есть. Собираюсь реализовать завтра.
Это может сработать для вас (GNU sed):
sed -r 's/[^,"]*("[^"]*")*/\n&\n/6;h;s/, ?/, /g;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file
Шестое поле окружите символами новой строки. Сделайте копию строки. Замените все запятые, за которыми следует возможный пробел, на запятую, за которой следует пробел. Добавьте исходную строку и, используя сопоставление с образцом, замените измененное поле, удалив остальную часть улучшенной строки.
Вы хотите добавить пробел после запятой, если его нет? Запятая должна существовать, чтобы добавить после нее пробел. Как выглядит входной файл? Как это разделено? Пробелами, значит, awk может его разобрать? Каков ожидаемый результат? @edit och Я понял, вы хотите добавить пробел после запятой, если пробел не существует, сэр.