Encontre texto entre a tabulação (\ t) como um delimitador

3

Eu achei que isso seria simples, mas não consegui descobrir como fazer isso.

Cenário

Eu tenho um único arquivo .csv com colunas id_user , text , id_group , onde cada coluna é delimitada por tabs , como:

"123456789"        "Here's the field of the text, also contains comma"        "10"
"987456321"        "Here's the field of the text, also contains comma"        "10"
"123654789"        "Here's the field of the text, also contains comma"        "11"
"987456123"        "Here's the field of the text, also contains comma"        "11"

Como encontrar o texto?

Tentativa

awk

Eu estava procurando uma maneira de especificar o delimitador print $n , se eu pudesse fazer isso, uma opção seria

$ awk -d '\t' '{print $2}' file.csv | sed -e 's/"//gp'

em que -d é o delimitador da opção print e o sed retira o "

    
por tachomi 08.09.2015 / 17:02

5 respostas

8

Delimitador de TAB

corte

Você não precisa de sed ou awk , um simples cut fará:

cut -f2 infile

awk

Se você quiser usar o awk, a maneira de fornecer o delimitador é através do argumento -F ou como FS= postfix:

awk -F '\t' '{ print $2 }' infile

Ou:

awk '{ print $2 }' FS='\t' infile

Saída em todos os casos:

"Here's the field of the text, also contains comma"
"Here's the field of the text, also contains comma"
"Here's the field of the text, also contains comma"
"Here's the field of the text, also contains comma"

Delimitar citação

Se as aspas duplas no arquivo forem consistentes, ou seja, sem aspas duplas incorporadas nos campos, você poderá usá-las como delimitador e evitar tê-las na saída, por exemplo:

corte

cut -d\" -f4 infile

awk

awk -F\" '{ print $4 }' infile

Saída nos dois casos:

Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
    
por 08.09.2015 / 17:13
4

Você pode usar grep com PCRE ( -P ):

grep -Po '\s"\K[^"]+(?="\s)' file.txt
  • \s" corresponde a qualquer espaço em branco seguido por um " , \K descarta a correspondência

  • [^"]+ obtém nossa parte desejada entre dois " s

  • (?="\s) é um padrão lookahead positivo com largura zero garantindo que a parte necessária seja seguida por " e qualquer caractere de espaço em branco.

Exemplo:

$ grep -Po '\s"\K[^"]+(?="\s)' file.txt 
Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
    
por 08.09.2015 / 17:08
2

Para especificar o tab como um delimitador

$ awk -F '\t' '{print $2}' file.csv

Para remover o percentual indesejado de"

$ awk -F '\t' '{print $2}' file.csv | sed 's/"//g'

Outra opção usando awk -F

$ awk -F '"' '{print $4}' file.csv
    
por 08.09.2015 / 18:06
1

Eu usaria perl para isso, porque Text::CSV é realmente bom para lidar com CSV não trivial (por exemplo, envolvendo citações):

#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;

open ( my $input, '<', "file.csv" ) or die $!;   
my $csv = Text::CSV -> new ( { binary => 1, 
                               sep_char => "\t", } );

while ( my $row = $csv -> getline ( $input ) ) {
    print $row -> [1],"\n";
}
close ( $input );

Impressões:

Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
Here's the field of the text, also contains comma
    
por 08.09.2015 / 18:34
1

Sua parte sed está correta. Você pode usar awk -F '\t' ou o seguinte,

awk 'BEGIN{FS="\t"} {print $2}' file.csv | sed 's/"//g'

ou se você não quiser usar sed, você pode enviar a saída do primeiro awk para o segundo awk e depois usar '' 'como o delimitador de campo e depois imprimir o segundo campo.

awk 'BEGIN{FS="\t"} {print $2}' file.csv | awk -F "\"" '{print $2}'
    
por 08.09.2015 / 19:33