如何获取文本文件,跳过前14条记录,跳过最后2条记录,将其他所有内容放入新文件中?
我可以编写一个简单的Java或python代码来执行此操作,但我正在寻找更简单的bash脚本/命令行。
任何人都可以帮助我吗?
答案 0 :(得分:2)
如果您希望跳过前N(14)行和最后M(2)行,可以使用awk
#!/bin/bash
awk -v N="$(wc -l < inputfile.txt)" -v first_lines=14 -v last_lines=2 '{
if (NR >= first_lines && NR <= N - last_lines)
print $0
}' inputfile.txt >> outfile.txt 2>&1
希望这有助于你
答案 1 :(得分:0)
最简单的解决方案是head
和tail
:
# hf_filter - remove a header and footer of fixed length from the input
$ hf_filter () { tail -n +$(($1 + 1)) | head -n -$2; }
$ hf_filter 14 2 < old.txt > new.txt
但是,这需要GNU head
,因为标准版本需要一个正整数作为-n
选项的参数。
此问题的解决方案需要缓冲$last
行输出或输入长度的先验知识。 (GNU head
为您做缓冲。)标准awk
解决方案可能看起来像
awk -v h=14 -v t=2 'NR > h {buf[NR]=$0; s=NR-t} s in buf {print buf[s]; delete buf[s]}' old.txt > new.txt
delete buf[s]
并非严格必要,但我认为它应该保持内存使用量不变(尽管我不知道awk
如何在内部管理内存分配。“ / p>
如果您不介意两次阅读输入,如果您还不知道,可以获得输入长度。
# Quotes are necessary; wc outputs leading spaces that break the assignment otherwise
awk -v n="$(wc -l < old.txt)" h=14 t=2 'NR > h && NR < n - t' old.txt > new.txt
答案 2 :(得分:-1)
您可以使用sed:
lines=$(wc -l < inputfile)
sed -n "15,$((lines-1))p" inputfile > outputfile