我有一个大文件,需要根据行号进行切割。 例如,我的文件是这样的:
aaaaaa
bbbbbb
cccccc
dddddd
****** //here blank line//
eeeeee
ffffff
gggggg
hhhhhh
*******//here blank line//
ıııııı
jjjjjj
kkkkkk
llllll
******
//And so on...
我需要两个单独的文件,这样一个文件应该有前4行,第3行,第5行4行,另一个文件应该有第4行,第4行,第4行,第6行等等。我怎么能用bash脚本呢?
答案 0 :(得分:2)
您可以使用行号NR
:
$ awk 'NR%10>0 && NR%10<5' your_file > file1
$ awk 'NR%10>5' your_file > file2
10K + n, 0 < n < 5
,则转到第一个文件。10K + n, n > 5
,则转到第二个文件。在一行中:
$ awk 'NR%10>0 && NR%10<5 {print > "file1"} NR%10>5 {print > "file2"}' file
$ cat a
1
2
3
4
6
7
8
9
11
12
13
14
16
17
18
19
21
22
23
24
26
27
28
29
31
32
33
34
36
37
38
39
41
42
43
44
46
47
48
49
51
$ awk 'NR%10>0 && NR%10<5 {print > "file1"} NR%10>5 {print > "file2"}' a
$ cat file1
1
2
3
4
11
12
13
14
21
22
23
24
31
32
33
34
41
42
43
44
51
$ cat file2
6
7
8
9
16
17
18
19
26
27
28
29
36
37
38
39
46
47
48
49
答案 1 :(得分:1)
您可以使用head
和tail
(不属于bash本身)执行此操作:
head -n 20 <file> | tail -n 5
为您提供第15至20行。
但是,如果您想要获取文件的多个部分,这是无效的,因为它必须一次又一次地进行解析。在这种情况下,我更喜欢一些真正的脚本。
答案 2 :(得分:1)
另一种方法是将空白行分隔的段落视为记录,并将奇数和偶数记录打印到不同的文件中:
awk -v RS= -v ORS='\n\n' '{
outfile = (NR % 2 == 1) ? "file1" : "file2"
print > outfile
}' file
答案 3 :(得分:0)
此脚本打印文件1.txt中的行,索引为0,1,2,3,8,9,10,11,16,17,18,19 ......
i=0
while read p; do
if [ $i%8 -lt 4 ]
then
echo $p
fi
let i=$i+1
done < 1.txt
此脚本打印带有索引4,5,6,7,12,13,14,15 ......的行
i=0
while read p; do
if [ $i%8 -gt 3 ]
then
echo $p
fi
let i=$i+1
done < 1.txt
答案 4 :(得分:0)
也许是这样的:
#!/bin/bash
EVEN="even.log"
ODD="odd.log"
line_count=0
block_count=0
while read line
do
# ignore blank lines
if [ ! -z "$line" ]; then
if [ $(( $block_count % 2 )) -eq 0 ]; then
# even
echo "$line" >> "$EVEN"
else
# odd
echo "$line" >> "$ODD"
fi
line_count=$[$line_count +1]
if [ "$line_count" -eq "4" ]; then
block_count=$[$block_count +1]
line_count=0
fi
fi
done < "$1"
第一个参数是源文件:./split.sh split_input