2013-04-20 97 views
1

所以我有一個文件,我想剪掉它的前33行和最後6行。我想要做的是在cat命令(cat文件)中獲取整個文件,然後使用「head」和「tail」命令刪除這些部分,但我不知道如何去做。 EG(這只是想法)Shell腳本剪切文件的開頭和結尾

cat file - head -n 33 file - tail -n 6 file 

我應該怎麼做呢?是否有可能用「sed」(如何)做到這一點?提前致謝。

+1

您可以刪除第33行用'sed'足夠容易:'sed的「1, 33d'文件'。 「sed」不能做的是從最後一行(或當前行)向後計數,所以'最後6行'部分不能用'sed'明智地解決。 (你可以通過握持空間和圖案空間進行非凡的旋轉,但是爲了你的理智,不要去探索它們。) – 2013-04-21 00:00:42

+0

@JonathanLeffler它已經被'sed'回答了,沒有使用保持空間。但是,我明白你的觀點。 – 2013-04-21 00:10:26

+1

@StevenPenny:我沒有在思想上做過'sed'腳本,是的,有一個解決方案適用於33和6的情況,只有模式空間(所以我過分複雜)。然而,推廣這個解決方案來處理25和20將是'sed'腳本生成中的一個混亂的練習,並且處理200和250不會考慮。從這個角度來看,使用'tail'去除除前N行和所有除最後M行之外的所有行都更好(至少你只需要調整一個整數值)。 – 2013-04-21 00:23:04

回答

3

這可能是你想要什麼:

$ tail -n +34 file | head -n -6 

見的,而不是過去的10 tail

-n,--lines = K 輸出的最後K線;或使用-n + K到輸出開始的行第K個

head

-n,--lines = [ - ]ķ 打印第一K行,而不是第一個10;與領先的' - ',打印每個文件的所有,但最後K行

手冊頁。

例子:

$ cat file 
one 
two 
three 
four 
five 
six 
seven 
eight 

$ tail -n +4 file | head -n -2 
four 
five 
six 

請注意,您不需要cat(見UUOC)。

2

第一計數總線,然後打印中間部分:(讀文件兩次)

l=$(wc -l file) 
awk -v l="$l" 'NR>33&&NR<l-6' file 

或在陣列加載文件,然後打印線需要:(讀文件一次)

awk '{a[NR]=$0}END{for(i=34;i<NR-6;i++)print a[i]}' file 

或頭部的awk,不想那麼多了這種方式:(讀文件兩次)

awk 'NR>33' file|head -n-6 
1
sed -n '1,33b; 34{N;N;N;N;N};N;P;D' file 

這將工作+

1

這可能會爲你工作(GNU SED):

sed '1,33d;:a;$d;N;s/\n/&/6;Ta;P;D' file 
相關問題