根据预定义的行集拆分文件

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需要将该位分解为两个单独的调用,类似于第一个脚本。


frl*_*lan 0

您可以使用该工具split例如可以在这里找到一堆例子

但是,在你的情况下类似

split -l 2 <inputfile>
Run Code Online (Sandbox Code Playgroud)

将创建一组包含两行的文件,称为 xaa、xab ...