ADJ*_*ADJ 5 command-line split text-processing
我想根据一组预定义的行拆分文本文件。例如。我有一个文件
a
b
c
d
e
f
Run Code Online (Sandbox Code Playgroud)
然后我有以下几组行(这些可以存储,但更方便,在一个文件,多个文件,......)。
1,2
3,6
5,4
Run Code Online (Sandbox Code Playgroud)
我想拆分我的文件,以便我得到 3 个文件,例如:
文件 1
a
b
Run Code Online (Sandbox Code Playgroud)
文件 2
c
f
Run Code Online (Sandbox Code Playgroud)
文件 3
e
d
Run Code Online (Sandbox Code Playgroud)
小智 3
下面是一个bash脚本,假设您的输入文件名为 infile,并且范围以每行 1 的形式存储在名为 splits 的文件中:
i=1
for range in $(< splits); do
sed -n "$(echo "$range" | cut -f1 -d, )p" infile > "file$i"
sed -n "$(echo "$range" | cut -f2 -d, )p" infile >> "file$i"
((i++))
done
Run Code Online (Sandbox Code Playgroud)
这仅用于sed打印范围指定的行,并将每个结果保存为新文件(创建的文件名为 file1 file2 file3 等)。两次调用sed用于保留指定的行顺序。
请注意,这个简单的脚本没有进行格式或错误检查,并且名为 file1 的现有文件将被覆盖。
一个简化的替代方案(由@muru提供)使用while read并让 bash 分割范围而不是剪切:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Run Code Online (Sandbox Code Playgroud)
如果输出文件中的行顺序很重要(例如,行 5,4!= 4,5),则sed需要将该位分解为两个单独的调用,类似于第一个脚本。
您可以使用该工具split。例如可以在这里找到一堆例子
但是,在你的情况下类似
split -l 2 <inputfile>
Run Code Online (Sandbox Code Playgroud)
将创建一组包含两行的文件,称为 xaa、xab ...