Personalizado Classifique e remova a junção de aspas duplas pelo sublinhado de várias colunas do arquivo delimitado por tabulação

2


A classificação personalizada com base na ordem da coluna de assunto deve ser matemática, inglês, ciência

quando eu uso este comando abaixo

awk -F',' '{if (NR!=1) {print $2,$3,$5,$4}}' myfile.csv

no meu myfile.csv estou ficando assim, mas quero outra maneira

"101"    "Anna"    "Maths"    "V"
"102"    "Bob"    "Maths"    "V"
"103"    "Charles"    "Science"    "VI"
"104"    "Darwin"    "Science"    "VI"
"105"    "Eva"    "English"    "VII"

o classificar com base na ordem da coluna de assunto deve ser Maths, English, Science
removeu aspas duplas e uniu-se ao sublinhado
assim

101_Anna_Maths_V
102_Bob_Maths_V
105_Eva_English_VII
103_Charles_Science_VI
104_Darwin_Science_VI

Arquivo original: saída de cat myfile.csv

Sl.No,RollNo,Names,Class,Subject
1,101,Anna,V,Maths
2,102,Bob,V,Maths
3,103,Charles,VI,Science
4,104,Darwin,VI,Science
5,105,Eva,VII,English
    
por bioinform 07.10.2017 / 13:05

3 respostas

5

Seu comando original:

awk -F',' '{if (NR!=1) {print $2,$3,$5,$4}}' myfile.csv

Seu comando está escrito no idiomático awk way:

awk -F',' 'NR > 1 { print $2, $3, $5, $4 }' myfile.csv

Acima do comando, modificado para remover todas as aspas duplas de cada linha de entrada para a qual NR > 1 :

awk -F',' 'NR > 1 { gsub(/"/, ""); print $2, $3, $5, $4 }' myfile.csv

Acima do comando, modificado para saída com _ como o separador do campo de saída ( OFS ):

awk -F',' -vOFS='_' 'NR > 1 { gsub(/"/, ""); print $2, $3, $5, $4 }' myfile.csv
    
por 07.10.2017 / 13:17
2

Como a questão é revisada, use abaixo de sed solution para determinada entrada para obter

  1. Swiping fields # 4 e # 5
  2. Remover primeiro campo
  3. Substituir vírgulas por sublinhado
  4. pula a primeira linha como cabeçalho
sed -r '2,$s/^[^,]*,// ; 2,$s/^([^,]*,[^,]*)(,[^,]*)(.*)// ; 2,$s/,/_/g'

Usando sed .

sed 's/"//g;s/[[:space:]]\+/_/g;/^$/d' infile
  • s/"//g Isso remove todas as citações " .
  • [[:space:]]\+ Isso substitui um ou mais espaços em branco por único Underscore _ .
  • /^$/d Isso remove linhas vazias, você pode removê-lo do comando se você não tiver nenhuma. ou altere com /^[[:space:]]*$/d para remover linhas apenas com Espaços / Tabulações / Esvaziar.

Substitua \+ pelo equivalente de \{1,\} padrão, se a implementação de sed não for compatível.

    
por 07.10.2017 / 13:09
1

Solução GNU awk para arquivo de entrada separado por vírgula (de acordo com o seu -F',' ):

awk -v FPAT='[^",[:space:]]+' 'NR>1{ for(i=1;i<=NF;i++) printf "%s%s",$i,(i<NF)?OFS:ORS }' OFS='_' myfile.csv

A saída:

01_Anna_Maths_V
102_Bob_Maths_V
103_Charles_Science_VI
104_Darwin_Science_VI
105_Eva_Maths_VII
    
por 07.10.2017 / 14:27