我有文件n线。 (每行指一个“问题”,因此它们被标记为Q.1
, Q.2
, Q.3
, ..., 。)每行(问题)都有一个“Marks”属性,其值为 2、3、4、5 或 6 。 有Q.n
n每个值⁄ 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
每个生成的文件都会有n⁄ 5行。
我想做逆运算——即产生上述结果的转置。我想将我的questions.txt
文件分成n⁄ 5 个文件:questions1.txt
,
questions2.txt
, questions3.txt
, ..., (使用questionsM.txt
中号代表n⁄ 5 ) 其中每个文件长五行,并且是异质(即,全部不同)。
questions1.txt
应包含
- 第一行
questions.txt
与2 Marks
, - 第一行
questions.txt
与3 Marks
, - 第一行
questions.txt
与4 Marks
, - 第一行
questions.txt
与5 Marks
, 和 - 第一行
questions.txt
与6 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