awk или sed CSV манипулирование файлами - PullRequest
2 голосов
/ 11 марта 2011
"a004-1b","North","at006754"
"a004-1c","south","atytgh0"
"a004-1d","east","atrthh"
"a010-1a","midwest","atyu"
"a010-1b","south","rfg67"

Я хочу напечатать первый столбец и второй столбец без каких-либо лишних символов. Я хочу удалить все ("" и третий столбец). Заранее спасибо

Ответы [ 6 ]

4 голосов
/ 11 марта 2011
awk -F'^"|","|"$' '{print $2,$3}' ./infile.csv

Приведенный выше скрипт будет обрабатывать поля, которые содержат двойные кавычки или запятые. Единственный недостаток (если это можно так назвать) заключается в том, что первое поле начинается с $2

Подтверждение концепции

$ awk -F'^"|","|"$' '{print $2,$3}' ./infile.csv
a004-1b North

a004-1c south

a010-1a midwest

a010-1b south
2 голосов
/ 17 августа 2011

Вам нужен GNU Awk 4, чтобы это работало:

$ gawk -vFPAT='[^",]+' '{print $1,$2}'

Мне нравится эта новая функция "полевой рисунок". Это мой новый молоток, и все это гвоздь. Читайте об этом на http://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

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

0 голосов
/ 17 августа 2011

Не обрабатывать встроенные двойные кавычки:

sed -e 's/^"\([^"]*\)","\([^"]*\)".*/\1 \2/'

Чтобы справиться с ними:

sed -n -e 's/^"//;s/"$//;s/","/ /;s/","/\n/;P'

Вышеописанное работает даже для ввода в поле 1 или 2.

0 голосов
/ 11 марта 2011
awk -F'\"|\,' '{print $2,$5}' sample
0 голосов
/ 11 марта 2011

Если вы используете для этого awk, зачем ставить на него тег Perl?

В Perl:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

# Make Data::Dumper pretty
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent   = 1;

# Set maximum depth for Data::Dumper, zero means unlimited
local $Data::Dumper::Maxdepth = 0;

use Text::CSV;

my $csv = Text::CSV->new();
while( my $row = $csv->getline( \*DATA )){
  print 'row: ', Dumper $row;
}

__DATA__
"a004-1b","North","at006754"
"a004-1c","south","atytgh0""a004-1d","east","atrthh"
"a010-1a","midwest","atyu"
"a010-1b","south","rfg67"
0 голосов
/ 11 марта 2011

Если вы хотите, чтобы это был "чистый" awk или sed, это не будет отвечать всем требованиям, но в противном случае это сработает:

awk -F, '{print $1 " " $2}' | tr -d '"'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...