zar*_*ara 3 linux shell text-processing cut split
我有一个每行 45000 个字符的文件,我想根据一行中的特定字符数拆分原始文件。作为一个小例子,我的输入文件如下所示:
输入.txt:
123394531112334455938383726644600000111234499922281133
234442221117273747474747474729292921111098887777772235
231112233647474838389292121037549284753930837475111013
Run Code Online (Sandbox Code Playgroud)
每行有 54 位数字。我希望前 10 位数字是一个单独的文件,而 11-24 是另一个文件。和从 25-32 位另一个文件和 33-50 最后一个文件,如:
out1.txt (1-10)
1233945311
2344422211
2311122336
Run Code Online (Sandbox Code Playgroud)
out2.txt (11-24)
12334455938383
17273747474747
47474838389292
Run Code Online (Sandbox Code Playgroud)
out3.txt (25-32)
72664460
47472929
12103754
Run Code Online (Sandbox Code Playgroud)
out4.txt (33-54)
0000111234499922281133
2921111098887777772235
9284753930837475111013
Run Code Online (Sandbox Code Playgroud)
请问有什么建议吗?
您可以cut多次调用:
cut -c 1-10 < file > out1.txt
cut -c 11-24 < file > out2.txt
cut -c 25-32 < file > out3.txt
cut -c 33-54 < file > out4.txt
Run Code Online (Sandbox Code Playgroud)
(请注意,当前版本的 GNUcut不支持多字节字符(对于输入中的 ASCII 十进制数字,这不应该是一个问题))
或者awk一次性完成:
awk '{
print substr($0, 1, 10) > "out1.txt"
print substr($0, 11, 14) > "out2.txt"
print substr($0, 25, 8 ) > "out3.txt"
print substr($0, 33, 22) > "out4.txt"}' < file
Run Code Online (Sandbox Code Playgroud)
(请注意,awk类似当前版本的某些实现mawk不支持多字节字符(对于 ASCII 十进制数字不应该是一个问题))
使用 GNU awk,您还可以执行以下操作:
awk -v FIELDWIDTHS='10 14 8 22' '
{for (i = 1; i <= NF; i++) print $i > "out" i ".txt"}' < file
Run Code Online (Sandbox Code Playgroud)