如何在命令行

时间:2018-04-26 02:20:25

标签: bash shell

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

我可以编写一个简单的Java或python代码来执行此操作,但我正在寻找更简单的bash脚本/命令行。

任何人都可以帮助我吗?

3 个答案:

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

最简单的解决方案是headtail

的组合
# 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