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