将线路分组为异构子集

将线路分组为异构子集

我有文件n线。 (每行指一个“问题”,因此它们被标记为Q.1, Q.2, Q.3, ..., 。)每行(问题)都有一个“Marks”属性,其值为 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

我知道我可以把它分成五个同质(即,全部相同)具有类似内容的文件

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 ) 其中每个文件长五行,并且是异质(即,全部不同)。

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、shell 脚本等)实现这一点?

答案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

相关内容