Bash 如何在命令行中解析变量

Bash 如何在命令行中解析变量,bash,shell,Bash,Shell,如何获取文本文件,跳过前14条记录,跳过最后2条记录,将其他所有内容放入新文件 我可以编写一个简单的Java或python代码来实现这一点,但我正在寻找更简单的bash脚本/命令行 有人可以帮我吗?如果您想跳过前N(14)行和最后M(2)行,可以使用awk #/bin/bash awk-v N=“$(wc-l=第一行&&NR最简单的解决方案是将头部和尾部结合起来: # hf_filter - remove a header and footer of fixed length from the

如何获取文本文件,跳过前14条记录,跳过最后2条记录,将其他所有内容放入新文件

我可以编写一个简单的Java或python代码来实现这一点,但我正在寻找更简单的bash脚本/命令行


有人可以帮我吗?

如果您想跳过前N(14)行和最后M(2)行,可以使用
awk

#/bin/bash
awk-v N=“$(wc-l如果(NR>=第一行&&NR最简单的解决方案是将
头部
尾部
结合起来:

# 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
delete buf[s]
并不是绝对必要的,但我认为它应该保持内存使用量不变(尽管我真的不知道
awk
如何在内部管理内存分配)

如果你不介意读两次输入,如果你还不知道输入的长度,你可以得到它

# 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
#引号是必需的;wc输出前导空格,否则会中断赋值
awk-v n=“$(wc-lh&&NRnew.txt
您可以使用sed:

lines=$(wc -l < inputfile)                                            
sed -n "15,$((lines-1))p" inputfile > outputfile
line=$(wc-loutputfile

看看head and tail,或sed你说的
14条记录是什么意思
?它们与其他记录有何不同?看看这里:附加到输出文件,而不是从一开始就写入它?@CharlesDuffy它从第15行追加到最后一行,但只有2行。假设inputfile.txt中的第1行2行3行4行5行6行7 8行,如果前2行和后2行过滤,那么outfile.txt c包含3 4 5 6行。这不起作用;如果14@chepner谢谢,很好的捕获,它会输出x行。这与请求相反;它输出应该跳过的行。你是对的,我最初的“解决方案”与OP想要的相反。我更新了我的答案。
# 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
lines=$(wc -l < inputfile)                                            
sed -n "15,$((lines-1))p" inputfile > outputfile