您能否帮我根据第二列将如下所示的文件拆分为两个文件(以值 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
这将检查第二列并检查其值是否为1
或0.1
。
- 如果是,
1
并且我们尚未处于“线路组”中,则会将计数器设置n
为1
。如果该计数器非零,但小于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
缓冲区的当前内容写入指定文件。