如何使用UNIX shell脚本删除平面文件的页眉和页脚记录?

时间:2010-11-16 11:52:36

标签: unix scripting shell

我有一个平面文件,如下所示。如何使用UNIX shell脚本从文件中删除页眉和页脚并重写相同的文件。

9 20050427 HEADER RECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
6 20050427 TRAILER RECORD

谢谢, 阿伦

8 个答案:

答案 0 :(得分:10)

...和sed

正如@Baramin所说:输入的最少量是sed '1d;$d',以下是它的工作原理:

按行号

sed -i'' -e '1d' -e '$d' yourfile

1d删除第一行$d删除最后一行。

或按模式

sed -r -i -e '/^[0-9] [0-9]{8} HEADER RECORD$/d' \
          -e '/^[0-9] [0-9]{8} TRAILER RECORD$/d' yourfile
-r扩展正则表达式需要

{8}

或两者

如果你是超级迂腐,并且想以最彻底的方式掩饰你的屁股:

sed -r -i.bak -e '1{/^[0-9] [0-9]{8} HEADER RECORD$/d}' \
              -e '${/^[0-9] [0-9]{8} TRAILER RECORD$/d}' yourfile

-i''将就地更改yourfile。如果要将输出存储在另一个文件中(例如,在行尾有> outputfile),请将其删除。

答案 1 :(得分:8)

tail -n +2 filename | head -n -1

没有我的unix盒子进行测试所以这些数字可能是1或2,我不记得他们是机器人1,2还是什么,但我一直都是这样的(我只是在之前开始我运行cmd看看它是1还是2 ...... tail ...应该删除第一行而head ...应删除最后一行

答案 2 :(得分:3)

这很难看,但它似乎有效,至少在你的输入上是这样的:

f='test.txt'; g=`wc -l $f`; h=`echo $g | cut -d ' ' -f1`; head -n $((h-1)) $f | tail -n $((h-2))

f是文件的名称。我无法找到更快的方法来摆脱wc输出的文件名。有人应该能够击败这个。

如果要重写同一文件,只需重定向命令的输出:

f='test.txt'; g=`wc -l $f`; h=`echo $g | cut -d ' ' -f1`; head -n $((h-1)) $f | tail -n $((h-2)) > $f

答案 3 :(得分:2)

OTOH,这两个命令会剪切文件的第一行和最后一行。

  • head -n -1会剪切文件的最后一行。
  • awk可用于使用awk 'NR>1 {print}'
  • 等命令剪切文件的第一行

或者,您可以使用grep -v过滤掉第一行和最后一行,如果它们可以通过字符串匹配可靠地识别。

答案 4 :(得分:2)

非常简单的问题解决方案

sed -i '1d;$d' yourfile

答案 5 :(得分:0)

我以这种方式得到了...并感谢所有人的帮助。

wc -l fileman |awk '{print $1-0}' |xargs -i head -{} filename | sed -n '2,$p' > filename

答案 6 :(得分:0)

只是抛出更多选择:

awk -v last=$(wc -l < filename) 'NR == 1 || NR == last {next} {print}' filename
awk 'NR==1 {next} NR==2 {prev = $0; next} {print prev; prev = $0}' filename

如果您没有使用sed -i

,则覆盖当前文件
( whatever | pipeline ) <filename >filename.tmp && 
ln filename filename.bak &&
mv filename.tmp filename

答案 7 :(得分:0)

这是另一个更简单的选项(如果你的尾部支持+语义)

tail -n +2 <file> | head -n -1