根据行号拆分文件

时间:2013-10-02 11:01:51

标签: bash file split

我有一个大文件,需要根据行号进行切割。 例如,我的文件是这样的:

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脚本呢?

5 个答案:

答案 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)

您可以使用headtail(不属于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