2012-02-14 8 views
3

私は、ファイルのヘッダ(最初の行)をエコーし​​、本体(残りの行)をstdoutに渡す "body"というbash関数を得ました。これは私がヘッダーを持つファイルを操作するのに非常に便利です。unix skip-header bash関数

例:

file.csvになり:

field1,field2 
a,2 
b,1 

コマンド:

$ sort -k2,2 -nr file.csv -t, 
a,2 
b,1 
field1,field2 

$ cat file.csv | body sort -nr -t, -k2,2 
field1,field2 
a,2 
b,1 

ていない良い例が、それは上に滞在ヘッダを示しています。

Google検索と検索stackoverflowの分は何も明らかにしていません。

誰もこのような機能を見つけたり、再構築することはできますか?

+2

LOLです。 "グーグルの議事録..."マイクロ波社会はそれほど? :) –

+1

"ファイルのヘッダ"とは何ですか?これは、ファイルの種類に応じてさまざまなことを意味します。ファイルの最初の行を出力する 'head'プログラムが必要なのでしょうか? –

+1

あなたはそのリンクを持っていますか**どこかでstackoverflowに**? – anubhava

答えて

2

@summeaは私が求めていた答えを見つけました: Bashのボディ機能はhere

# print the header (the first line of input) 
# and then run the specified command on the body (the rest of the input) 
# use it in a pipeline, e.g. ps | body grep somepattern 
body() { 
    IFS= read -r header 
    printf '%s\n' "$header" 
    "[email protected]" 
} 
5

ここでは、ヘッダをつかんでcsvファイルの残りの部分をつかんで並べ替えることができます。 outpipe

head -1 file.csv > outpipe | tail -n+2 file.csv | sort >> outpipe 

編集:そのアプローチはあなたのために動作しない場合は

、あなたは常にthis previous discussionで回答ような何かを試みることができます。

+0

ありがとうございますが、私は尾の働きを知っています。 – dfrankow

+0

あなたは 'tail'を使用できませんか? – summea

+0

私は上に明確にしようとした:私は尾が必要ではありません。最初の行と残りの行を区切り、残りの行をパイプラインに送信し、最初の行と残りの行をまとめて出力します。 – dfrankow

2

根拠が単にファイルからout.fileを再構築するために、次のようになります。

(head -n1 file; tail -n+2 file) > out.file 

あなたは第二部で何とか動作する:

(head -n1 file; tail -n+2 file | voodoo -zack -peng) > out.file 
+0

それは素晴らしいです。私はあなたがそのような2つのコマンドの出力をグループ化できるとは考えていませんでした。ありがとう! –