Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 根据行号拆分文件_Bash_File_Split - Fatal编程技术网

Bash 根据行号拆分文件

Bash 根据行号拆分文件,bash,file,split,Bash,File,Split,我有一个大文件,需要根据行号进行分割。 例如,我的文件如下所示: aaaaaa bbbbbb cccccc dddddd ****** //here blank line// eeeeee ffffff gggggg hhhhhh *******//here blank line// ıııııı jjjjjj kkkkkk llllll ****** //And so on... #!/bin/bash EVEN="even.log" ODD="odd.log" line_coun

我有一个大文件,需要根据行号进行分割。 例如,我的文件如下所示:

aaaaaa 
bbbbbb  
cccccc
dddddd
****** //here blank line//
eeeeee
ffffff
gggggg
hhhhhh
*******//here blank line//
ıııııı
jjjjjj
kkkkkk
llllll
******
//And so on...
#!/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"
我需要两个单独的文件,这样一个文件应该有前4行,第三个4行,第五个4行,另一个文件应该有第二个4行,第四个4行,第六个4行,依此类推。如何在bash脚本中实现这一点?

您可以使用不属于bash本身的head和tail来实现这一点:

head -n 20 <file> | tail -n 5
给你第15到20行


然而,如果您想获取文件的多个部分,这是低效的,因为必须一次又一次地解析它。在这种情况下,我更喜欢一些真正的脚本。

您可以使用行数,NR:

测验
此脚本打印文件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

也许是这样的:

aaaaaa 
bbbbbb  
cccccc
dddddd
****** //here blank line//
eeeeee
ffffff
gggggg
hhhhhh
*******//here blank line//
ıııııı
jjjjjj
kkkkkk
llllll
******
//And so on...
#!/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

另一种方法是将空行分隔的段落视为记录,并将奇数和偶数记录打印到不同的文件:

awk -v RS= -v ORS='\n\n' '{
    outfile = (NR % 2 == 1) ? "file1" : "file2"
    print > outfile
}' file

谢谢你;正如你们所说,我正在寻找一个脚本。谢谢你们所有人的回复和帮助。作为我自己的解决方案,你们使用的awk工具不是bash的一部分。注意到了。是的,我知道,谢谢@urzeit。在这种情况下,使用head和tail是不够的,除非您想做非常棘手的事情。awk安装在几乎所有的服务器上,所以只要看看它对OP是否有效。@Kent是的,只是相应地更新并添加了一个测试。我实际上在每个数据块中有201行。我们可以使用上面的脚本将前201行拆分为文件1,后201行拆分为文件2吗?是的,当然@user210016,只需将所有10行替换为201即可。亲爱的glenn;它没有像我期望的那样给出文件2。ıt只给出文件1。但是文件1与原始文件相同。脚本只为原始文件提供了一个新名称file1。但这种方法很好。我们如何改进它?嗯,对我来说很有用。你的操作系统是什么?您使用的是什么版本的awk?
awk -v RS= -v ORS='\n\n' '{
    outfile = (NR % 2 == 1) ? "file1" : "file2"
    print > outfile
}' file