在 AWK 和 SED 中,您都可以像这样定义 RegEx -
AWK:在 AWK 中,您会注意到我们没有在任何地方写 print。在 AWK 中(基于模式/动作语句,只要模式语句为真,打印就是默认动作。因此在以下情况下,只要 RegEx 模式为真,AWK 就会为我们打印它。
awk '/regex1/,/regex2/' INPUT_FILE > NEW_FILE
SED:在 SED 中,我们使用 -n 选项来禁止打印所有内容的默认行为,并使用带有 p 的 RegEx 来告诉 SED 打印特定行。
sed -n '/regex1/,/regex2/p' INPUT_FILE > NEW_FILE
或者,你也可以给下面的单行
sed '/regex1/,/regex2/!d' INPUT_FILE > NEW_FILE
使用重定向运算符>,您可以创建文件的子集。
对于在 AWK 中拆分文件,如果您知道文件中的记录数 (wc -l < INPUT_FILE),那么您可以这样写 -
awk 'NR==2,NR==5' INPUT_FILE
NR 是 AWK 的内置变量,它被设置为记录的行号。所以如果你有一个 1500 行的文件并且只需要前 750 行,那么你可以做这样的事情 -
awk 'NR==1,NR==750' INPUT_FILE
如前所述,您可以但不必在 AWK 中提及 print。只要您的模式是真实的,它就会为您服务。
尽管您的文件中有一百万行,但这将是一个很大的痛苦。所以下面的 AWK 单线应该可以解决问题。
awk '{print >("SMALL_BATCH_OF_FILES_" int((NR+2)/3))}' BIG_INPUT_FILE
这一行将创建 SMALL_BATCH_OF_FILES_,每行包含 3 行。您可以将其设置为您的舒适度。 (NR+2/3)
执行:
[jaypal~/Temp]$ cat BIG_INPUT_FILE
1
2
3
4
5
6
7
8
9
10
[jaypal~/Temp]$ awk '{print >("SMALL_BATCH_OF_FILES_" int((NR+2)/3))}' BIG_INPUT_FILE
[jaypal~/Temp]$ ls -lrt SMALL*
-rw-r--r-- 1 jaypalsingh staff 3 25 Nov 10:41 SMALL_BATCH_OF_FILES_4
-rw-r--r-- 1 jaypalsingh staff 6 25 Nov 10:41 SMALL_BATCH_OF_FILES_3
-rw-r--r-- 1 jaypalsingh staff 6 25 Nov 10:41 SMALL_BATCH_OF_FILES_2
-rw-r--r-- 1 jaypalsingh staff 6 25 Nov 10:41 SMALL_BATCH_OF_FILES_1
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_1
1
2
3
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_2
4
5
6
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_3
7
8
9
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_4
10