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