Agrupando linhas em subconjuntos heterogêneos

2

Eu tenho arquivo com linhas n . (Cada linha refere-se a uma "questão" e portanto, eles são rotulados como Q.1 , Q.2 , Q.3 , ..., Q.n .) Cada linha (questão) tem um atributo "Marcas", que tem o valor 2, 3, 4, 5 ou 6. Existem n 5 linhas com cada valor.

Por exemplo: um arquivo de 10 linhas (ou seja, n = 10) pode parecer

amol@mypc:~$ cat questions.txt
Q.1 2 Marks
Q.2 5 Marks
Q.3 4 Marks
Q.4 3 Marks
Q.5 6 Marks
Q.6 4 Marks
Q.7 3 Marks
Q.8 2 Marks
Q.9 6 Marks
Q.10 5 Marks

Eu sei que posso dividir isso em cinco arquivos homogêneos (ou seja, todos iguais) com algo como

amol@mypc:~$ grep " 2 Marks" questions.txt > questions2Marks.txt
amol@mypc:~$ grep " 3 Marks" questions.txt > questions3Marks.txt
amol@mypc:~$ grep " 4 Marks" questions.txt > questions4Marks.txt
amol@mypc:~$ grep " 5 Marks" questions.txt > questions5Marks.txt
amol@mypc:~$ grep " 6 Marks" questions.txt > questions6Marks.txt

Cada um dos arquivos resultantes terá n 5 linhas.

Eu quero fazer a operação inversa - isto é, produzir uma transposição do resultado acima. Quero dividir meu arquivo questions.txt em arquivos n 5 : questions1.txt , questions2.txt , questions3.txt , ..., questionsM.txt (usando M para representar n 5 ) onde cada arquivo tem cinco linhas de comprimento e é heterogêneo (isto é, todas diferentes).

questions1.txt deve conter

  • a primeira linha em questions.txt com 2 Marks ,
  • a primeira linha em questions.txt com 3 Marks ,
  • a primeira linha em questions.txt com 4 Marks ,
  • a primeira linha em questions.txt com 5 Marks e
  • a primeira linha em questions.txt com 6 Marks ,

nessa ordem. questions2.txt deve conter a segunda linha de cada, etc.

Então, para n = 10, M obviamente é 2. Eu gostaria que meu exemplo questions.txt acima fosse dividido nesses dois arquivos:

amol@mypc:~$ cat questions1.txt            
Q.1 2 Marks
Q.4 3 Marks
Q.3 4 Marks
Q.2 5 Marks
Q.5 6 Marks

amol@mypc:~$ cat questions2.txt            
Q.8 2 Marks
Q.7 3 Marks
Q.6 4 Marks
Q.10 5 Marks
Q.9 6 Marks

Como posso conseguir isso usando as ferramentas * nix? (sed, awk, perl, script de shell, etc ...)?

    
por amolveer 24.07.2015 / 09:49

2 respostas

6
sort -n -k2 -k1.3 file | awk '{$2!=a?x=1:x++} {print > "file"x; a=$2}'

Primeiro, precisamos classificar o arquivo corretamente. -n ordena o arquivo numericamente, -k2 ordena de acordo com o segundo campo (as marcas 2-6), -k1.3 então ordena dentro desta ordem o primeiro campo iniciando do terceiro caracter numérico (ignorando o primeiro Q. ) . Agora awk divide a saída entre arquivos ascendentes (arquivo1, arquivo2, arquivo3, arquivo ....).

A saída é assim, file1 :

$ cat file1
Q.1 2 Marks
Q.4 3 Marks
Q.3 4 Marks
Q.2 5 Marks
Q.5 6 Marks

e file2 :

$ cat file2
Q.8 2 Marks
Q.7 3 Marks
Q.6 4 Marks
Q.10 5 Marks
Q.9 6 Marks
    
por 24.07.2015 / 10:16
3

uma resposta do awk: isso manterá a ordem das perguntas da mesma forma que no arquivo de origem.

$ awk '{filename = "questions" ++n[$2] ".txt"; print > filename}' questions.txt 
$ cat questions1.txt 
Q.1 2 Marks
Q.2 5 Marks
Q.3 4 Marks
Q.4 3 Marks
Q.5 6 Marks
$ cat questions2.txt 
Q.6 4 Marks
Q.7 3 Marks
Q.8 2 Marks
Q.9 6 Marks
Q.10 5 Marks
    
por 24.07.2015 / 17:02