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

我有一个平面文件,如下所示。 如何使用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 

谢谢阿伦

这很丑陋,但似乎起作用,至少在你的输入上:

 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 

…和sed

正如@Baramin所指出的那样:键入的最少量是sed'1d 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 

{8}扩展正则表达式需要-r

或两者

如果你是超级迂腐的,并想以最眩目的方式掩盖你的屁股:

 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''会就地改变你的文件。 如果要将输出存储在另一个文件中(例如,在行尾有> outputfile ,请将其删除。

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

没有我的unix盒测试,所以这些数字可能是1或2,我不记得他们是否是机器人1,2或什么,但我是这样的所有时间(我刚刚experement之前,我运行cmd,看看它的1或2 … tail ...应该删除第一行和head ...应该删除最后

OTOH,一些将剪辑文件的第一行和最后一行的命令。

  • head -n -1将剪切文件的最后一行。
  • awk可以用awk 'NR>1 {print}'命令来剪辑文件的第一行

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

你的问题很简单的解决方案

 sed -i '1d;$d' yourfile 

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

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

只是抛出一些更多的选择:

 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 

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

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