ATUALIZAÇÃO:
Na verdade, uma maneira muito mais fácil é definir o separador de registro em gawk
:
$ gawk 'BEGIN{RS="\"\n"; FS=","}{print $4}' myFile.csv
"col4
"4th column
"4th column2
No entanto, isso removerá o "
final do final de cada coluna. Para corrigir isso, você mesmo pode imprimi-lo:
$ gawk 'BEGIN{RS="\"\n"; FS=","}{print $4"\""}' myFile.csv
"col4"
"4th column"
"4th column2"
Se você não quiser as aspas, você pode definir o separador de campo como ","
:
$ gawk 'BEGIN{RS="\"\n"; FS="\",\""}{print $3}' myFile.csv
col3
4th column
4th column2
A única maneira de pensar nisso Uma maneira de fazer isso é primeiro modificar o arquivo e depois analisá-lo. No seu exemplo, a nova linha que realmente separa dois registros sempre segue um "
:
"col1","col2","col3","col4" <-- here
1,"text1","<p>big <-- no "
Se esse for o caso de todo o arquivo, você poderá substituir todas as novas linhas que não sejam imediatamente após um "
por um espaço reservado e, assim, ter tudo em uma única linha. Você pode então analisar normalmente com gawk
e, finalmente, substituir o espaço reservado pela nova linha novamente. Usarei a string &%&
como espaço reservado, pois é improvável que exista em seu arquivo:
$ perl -pe 's/"\s*\n/"&%&/; s/\n//g; s/&%&/\n/;' myFile.csv | awk -F, '{print $4}'
"col4"
"4th column"
"4th column2"
O sinal -p
para perl
significa print each line of the input file
depois de aplicar o script fornecido por -e
. Então há 3 comandos de substituição ( s/foo/bar/
):
-
s/"\s*\n/"&%&/
: Isso localizará qualquer"
, seguido por 0 ou mais caracteres em branco (\s*
) e, em seguida, um caractere de nova linha (\n
). Ele substituirá isso por"&%&
. As aspas são adicionadas para preservar o formato e o&%&
é apenas um espaço reservado aleatório, pode ser qualquer coisa que não apareça no seu arquivo. -
s/\n//g;
: como as novas linhas reais foram substituídas pelo marcador de posição, agora podemos remover com segurança todas as novas linhas restantes nesse registro. Isso significa que todas as linhas do registro atual foram agora concatenadas na linha atual. -
s/&%&/\n/
: isso transforma o alocador de espaço de volta em uma nova linha normal.
Para entender a saída do comando, execute-o sem gawk
:
$ perl -pe 's/"\s*\n/"&%&/; s/\n//g; s/&%&/\n/;' myFile.csv
"col1","col2","col3","col4"
1,"text1","<p>big html text</p>","4th column"
2,"text2","<p>big2 html2 text2</p>","4th column2"
Então, agora você tem seus registros longos em linhas simples e isso é um alimento perfeito para gawk
.
Você também pode fazer isso diretamente no Perl:
perl -ne '$/="\"\n"; chomp;@a=split(/,/);print "$a[3]\"\n"' myFile.csv
"col4"
"4th column"
"4th column2"
Isso está usando um pouco mais de magia Perl. A variável especial $/
é o separador de registro de entrada. Definindo-o como "\n
, informamos ao Perl para dividir as linhas não em \n
, mas apenas em "\n"
, para que cada registro seja tratado como uma única linha. Quando isso for feito, chomp
removerá a nova linha do final da linha (para impressão posterior) e split
dividirá cada registro (em ,
) e a salvará na matriz @a
. Finalmente, imprimimos o 4º elemento da matriz (os arrays são numerados de 0, de modo que é $a[3]
), que é a quarta coluna.
E ainda mais mágica, ative a autocorreção ( -a
) e divida-a por vírgulas ( F","
). Isso dividirá cada registro no array especial @F
e você poderá imprimir o 4º elemento do array:
$ perl -F"," -ane '$/="\"\n";chomp;print "$F[3]"' myFile.csv
"col4"
"4th column"
"4th column2"