根据第二列值拆分文件

根据第二列值拆分文件

您能否帮我根据第二列将如下所示的文件拆分为两个文件(以值 1 开头的组加上以下 2 行应位于一个文件中,以值 0.1 开头的组加上以下 2 行应位于一个文件中)在第二个文件中):

A 1
A 10
A 100
B 0.1
B 1
B 10
C 1
C 10
C 100
D 0.1
D 1
D 10

预期输出文件1:

A 1
A 10
A 100
C 1
C 10
C 100

预期输出文件2:

B 0.1
B 1
B 10
D 0.1
D 1
D 10

亲切的问候!!

答案1

$ cat tst.awk
!(c&&c--) {
    out = "out" ($2 == 1 ? 1 : 2)
    c = 2
}
{ print > out }

$ awk -f tst.awk file

$ head out?
==> out1 <==
A 1
A 10
A 100
C 1
C 10
C 100

==> out2 <==
B 0.1
B 1
B 10
D 0.1
D 1
D 10

使用 sed-或 awk-a-line-follow-a-matching-pattern 进行打印for what c&&c--does 和其他类似的 awk 习惯用法。

答案2

以下awk程序将起作用:

awk '$2=="1"&&!(n+m){n=1}
     $2=="0.1"&&!(n+m){m=1}
     n&&n<4{print > "file1.txt"; if (++n==4) n=0}
     m&&m<4{print > "file2.txt"; if (++m==4) m=0}' input.txt

这将检查第二列并检查其值是否为10.1

  • 如果是,1并且我们尚未处于“线路组”中,则会将计数器设置n1。如果该计数器非零,但小于4,则当前行将被打印到file1.txt(相当于起始行和随后的两行)。如果达到指定的行数,则计数器重置为0,表示该行组完成。
  • 对于第二个字段所在的行也是如此0.1,仅调用计数器m和输出文件file2.txt
  • 仅当我们尚未在组内时(即 和m均为n零),才会检查组开始。

答案3

使用sed

sed -n \
    -e '/[[:blank:]]1$/    {' -e 'N;N; w file1' -e '}' \
    -e '/[[:blank:]]0\.1$/ {' -e 'N;N; w file2' -e '}' file

file1如果当前行以空格(空格或制表符)结尾,则上面的代码会将当前行和接下来的两行写入名为 的文件中1

file2如果当前行以空格结尾且后跟0.1,则代码会将当前行和接下来的两行写入名为 的文件中。

N命令将sed下一行输入追加到编辑缓冲区,并将w缓冲区的当前内容写入指定文件。

相关内容