在AWK和SED中你都可以定义这样的RegEx -
AWK:在AWK你会注意到我们没有print在任何地方写过.在AWK中(基于模式/动作语句,只要模式语句为真,print就是默认操作.因此,在下面的情况下,只要RegEx模式为真,AWK就会为我们打印它.
awk '/regex1/,/regex2/' INPUT_FILE > NEW_FILE
Run Code Online (Sandbox Code Playgroud)
SED:在SED中,我们使用-n选项来禁止打印所有内容的默认行为,并使用RegEx p来告诉SED打印特定行.
sed -n '/regex1/,/regex2/p' INPUT_FILE > NEW_FILE
Run Code Online (Sandbox Code Playgroud)
或者,您也可以提供以下单行
sed '/regex1/,/regex2/!d' INPUT_FILE > NEW_FILE
Run Code Online (Sandbox Code Playgroud)
使用重定向运算符,>您可以创建文件的子集.
对于在AWK中拆分文件,如果您知道文件中的记录数(wc -l < INPUT_FILE),那么您可以编写类似这样的内容 -
awk 'NR==2,NR==5' INPUT_FILE
Run Code Online (Sandbox Code Playgroud)
NR是AWK的内置变量,它被设置为Record的行号.所以,如果你有一个1500行的文件,只需要前750,那么你可以做这样的事情 -
awk 'NR==1,NR==750' INPUT_FILE
Run Code Online (Sandbox Code Playgroud)
如前所述,你可以但你不必提及printAWK.只要你的模式是真的,它就会为你做到.
虽然文件中有一百万行,但这将是一个很大的痛苦.所以下面的AWK单行应该可以解决问题.
awk '{print >("SMALL_BATCH_OF_FILES_" int((NR+2)/3))}' BIG_INPUT_FILE
Run Code Online (Sandbox Code Playgroud)
这个单行将创建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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |