2016-05-06 2 views
1

У меня есть файл, где 10-я колонка в excel содержит цены.bash удалить/изменить значения из одного поля с помощью цикла

CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"5000",19.50,justin,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"75,000",19.50,bieber,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"100,000",19.50,selena,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"5500",19.50,gomez,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"50,000",19.50,gomez,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"350,000",19.50,bieber,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"50000",19.50,bieber,20160506,0,,N,E,,,,,, 

Когда он отправляется в csv кавычки и запятую. Мне нужно выделить столбец, окруженный кавычками - я использую grep -o , а затем после очистки запятых я избавлюсь от кавычек.

Я не могу использовать кавычки или запятые для разграничения в awk, потому что цены разбиваются на разные поля.

cat /tmp/wowmom | awk -F ',' '{print $10}' 
"5000" 
"75 
"100 
"5500" 
"50 
"350 
"50000" 



while read line 
    do 
    clean_price=$(grep -o '".*"' $line) 
    echo "$clean_price" | tr -d',' > cleanprice1 
    echo "cleanprice1" | tr -d'"' > clearnprice2 
done </tmp/wowmom 

я получаю ошибки, хотя «Нет такого файла или каталога» на Grep

grep:CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"5000",19.50,justin,20160506,0,,N,E,,,,,,:No such file or directory 
grep:CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"75,000",19.50,bieber,20160506,0,,N,E,,,,,,:No such file or directory 
grep:CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"100,000",19.50,selena,20160506,0,,N,E,,,,,,:No such file or directory 
grep:CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"50,000",19.50,gomez,20160506,0,,N,E,,,,,,:No such file or directory 
grep:CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,"350,000",19.50,bieber,20160506,0,,N,E,,,,,,:No such file or directory 

Я хочу, чтобы каким-то образом, не Изолировать значение в кавычках с Grep -o и вынимают запятой от номер, затем используйте awk для вывода котировок из поля 10. Я делаю это вручную прямо сейчас. Это сверхзадача - это тысячи строк.

ответ

1

Вам использовать FPAT с гну-AWK для этого:

awk -v FPAT='"[^"]+",|[^,]*' '{gsub(/[",]+/, "", $10)} 1' OFS=, file 

CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,5000,19.50,justin,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,75000,19.50,bieber,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,100000,19.50,selena,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,5500,19.50,gomez,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,50000,19.50,gomez,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,350000,19.50,bieber,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,50000,19.50,bieber,20160506,0,,N,E,,,,,, 
1

Вы используете неправильный инструмент здесь.

sed -r 's/^(([^,]+,){9})"([^,]+),?([^,]+)"/\1\3\4/' file.csv > newfile.csv 

Регулярное выражение захватывает первые девять поля в первой задней ссылки (а также заполнит второй с последним из девяти полей), число перед сепаратором запятой в третьем, а остальная часть число в четвертом, то подстановка клей их обратно без пропущенных элементов.

Если у вас есть номера с разделителем более чем на одну тысячу (например, более одного миллиона), вам понадобится немного более сложный сценарий.

С точки зрения того, что не так с исходным скриптом, второй аргумент grep - это имя файла grep, а не строка grep. Вы можете использовать строку здесь (в Bash) или передать строку в grep, но опять же, это не так, как вы делаете это правильно.

grep -o '"[^"]*"' <<<"$line" 

или

printf '%s' "$line" | grep -o '"[^"]*"' 

Обратите внимание также котировки - опуская кавычки общая ошибка новичка; вы можете уйти с ним на некоторое время, а затем это укусит вас.

+0

Ваш 'sed' лучше, чем у меня: 'sed' s/\ (. * \) "\ ([^,] * \) [,] * \ ([^,] * \)" \ (. * \)/\ 1 \ 2 \ 3 \ 4/''. –

0

Чистый Bash Решение:

while IFS=\" read -r l n r; do 
     printf '%s\n' "$l${n//,/}$r" 
done < input_file.txt 
+0

Есть ли чистое решение perl? – capser

+0

@capser Я не знаю Perl. –

0

Если вы ищете Perl:

#!perl 
use strict; 
use warnings; 
use Text::CSV; 
use autodie; 

my $csv = Text::CSV->new({binary=>1, eol=>"\n"}); 
my $filename = shift @ARGV; 
open my $fh, "<", $filename; 

while (my $row = $csv->getline($fh)) { 
    $row->[9] =~ s/,//g; 
    $csv->print(*STDOUT, $row); 
} 

close $fh; 

демо:

$ perl csv.pl file 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,5000,19.50,justin,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,75000,19.50,bieber,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,100000,19.50,selena,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,5500,19.50,gomez,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,50000,19.50,gomez,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,350000,19.50,bieber,20160506,0,,N,E,,,,,, 
CASPER,N,CUSIP,0000000000,WOWMOM,USD,USD,US,B,50000,19.50,bieber,20160506,0,,N,E,,,,,, 

 Смежные вопросы

  • Нет связанных вопросов^_^