라인을 이기종 하위 집합으로 그룹화

라인을 이기종 하위 집합으로 그룹화

파일이 있습니다N철사. (각 행은 "질문"을 참조하므로 Q.1, Q.2, , ..., 로 표시됩니다 Q.3.) 각 행(질문)에는 값이 2, 3, 4, 5 또는 6인 "표시" 속성이 있습니다. 가지다Q.nN값당 ⁄5개 행 .

예: 10줄 파일(예:N=10) 다음과 같이 보일 수 있습니다

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

5개로 나눌 수 있다는 걸 알아요동종의(즉, 모두 동일한) 유사한 내용을 가진 파일

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

생성된 각 파일에는N5 줄.

나는 역연산, 즉 위의 결과를 생성하는 전치를 수행하고 싶습니다. 내 questions.txt파일을 다음으로 분할하고 싶습니다 .N5 개 파일: questions1.txt, questions2.txt, questions3.txt, ..., (사용questionsM.txt중간 사이즈대표하다N5 ) 각 파일의 길이는 5줄이며 다음과 같습니다.이질적인(즉, 모두 다릅니다).

questions1.txt포함해야합니다

  • 첫 번째 줄 questions.txt2 Marks,
  • 첫 번째 줄 questions.txt3 Marks,
  • 첫 번째 줄 questions.txt4 Marks,
  • 첫 번째 줄 questions.txt5 Marks, 및
  • 첫 번째 줄 questions.txt6 Marks,

그와 같은 순서로.  questions2.txt각각의 두 번째 줄이 포함되어야 합니다.

그래서N=10,중간 사이즈분명히 2. questions.txt위의 예를 다음 두 파일로 분류하고 싶습니다 .

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

*nix 도구(sed, awk, perl, 쉘 스크립트 등)를 사용하여 이를 달성하려면 어떻게 해야 합니까?

답변1

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

먼저 파일을 올바르게 정렬해야 합니다. -n파일을 숫자로 정렬하고 -k2두 번째 필드(마커 2-6)를 기준으로 정렬한 -k1.3다음 해당 순서로 세 번째 문자부터 시작하는 첫 번째 필드를 숫자로 정렬합니다(선행 무시 Q.). 이제 awk출력을 오름차순 파일(file1, file2, file3, filen...)로 분할합니다.

출력은 다음과 같습니다 file1.

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

그리고 file2:

$ cat file2
Q.8 2 Marks
Q.7 3 Marks
Q.6 4 Marks
Q.10 5 Marks
Q.9 6 Marks

답변2

awk 답변: 이렇게 하면 소스 파일과 동일한 순서로 질문이 배치됩니다.

$ 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

관련 정보