問題描述
這是我的檔案
1
2
3
4
5
6
7
8
9
10
我想通過管道發送這個檔案的 cat 輸出并接收這個
% cat file | some_command
1
2
...
9
10
嘗試的解決方案
以下是我嘗試過的一些解決方案及其輸出
% cat temp | (head -n2 && echo '...' && tail -n2)
1
2
...
% cat temp | tee >(head -n3) >(tail -n3) >/dev/null
1
2
3
8
9
10
# I don't know how to get the ...
% cat temp | sed -e 1b -e '$!d'
1
10
% cat temp | awk 'NR==1;END{print}'
1
10
# Can only get 2 lines
uj5u.com熱心網友回復:
一個 awk:
awk -v head=2 -v tail=2 'FNR==NR && FNR<=head
FNR==NR && cnt ==head {print "..."}
NR>FNR && FNR>(cnt-tail)' file file
或者,如果單次傳遞很重要(并且記憶體允許),您可以使用perl:
perl -0777 -lanE 'BEGIN{$head=2; $tail=2;}
END{say join("\n", @F[0..$head-1],("..."),@F[-$tail..-1]);}' file
或者,一個 awk 是一次傳遞:
awk -v head=2 -v tail=2 'FNR<=head
{lines[FNR]=$0}
END{
print "..."
for (i=FNR-tail 1; i<=FNR; i ) print lines[i]
}' file
或者,直接成為穴居人沒有錯,例如:
head -2 file; echo "..."; tail -2 file
任何這些印刷品:
1
2
...
9
10
就效率而言,這里有一些統計資料。
對于小檔案(即小于 10 MB 左右),所有這些都小于 1 秒,而 'caveman' 方法是2 ms。
然后我創建了一個 1.1 GB 的檔案 seq 99999999 >file
- 兩通awk:50秒
- 一關 perl:10 秒
- 一關awk:29秒
- “穴居人”:2 毫秒
uj5u.com熱心網友回復:
你可以考慮這個 awk 解決方案:
awk -v top=2 -v bot=2 'FNR == NR { n; next} FNR <= top || FNR > n-top; FNR == top 1 {print "..."}' file{,}
1
2
...
9
10
uj5u.com熱心網友回復:
兩種單程sed解決方案:
sed '1,2b
3c\
...
N
$!D'
和
sed '1,2b
3c\
...
$!{h;d;}
H;g'
uj5u.com熱心網友回復:
我建議bash:
(head -n 2; echo "..."; tail -n 2) < file
輸出:
1 2 ... 9 10
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376530.html
上一篇:TCL處理引數模板
