ファイルからn行目を取得するBashツール


605

それを行う「標準的な」方法はありますか?私はhead -n | tail -1トリックを使用してきましたが、ファイルから行(または行の範囲)を明確に抽出するBashツールがあるかどうか疑問に思っていました。

「正規」とは、その主な機能がそれを行うプログラムを意味します。


10
「Unixの方法」は、それぞれの作業を適切に行うツールをチェーン化することです。だからあなたはすでに非常に適切な方法を見つけたと思います。他の方法が含まれawksed誰かがPerlのワンライナーなどを思い付くと確信しています;)
0xC0000022L

3
doubleコマンドは、head | tailソリューションが最適ではないことを示唆しています。より最適な他のソリューションが提案されています。
ジョナサンレフラー、

平均的なケースで最速のソリューションであるベンチマークを実行しましたか?
Marcin、

5
で(レンジ用)ベンチマークの巨大なファイル上の線Yに猫ラインXのUnixとLinux。(cc @ Marcin、2年以上経過しても疑問に思う場合)
Kevin

6
head | tailそれが最後の行が印刷されます:あなたが入力に存在しない行を照会する場合はソリューションは、仕事をしません。
jarno 2016年

回答:


803

headtail巨大なファイルの場合、パイプは遅くなります。私はsedこのように提案します:

sed 'NUMq;d' file

NUM印刷する行の番号はどこですか。たとえば、sed '10q;d' fileの10行目を印刷しfileます。

説明:

NUMq行番号がになるとすぐに終了しNUMます。

d行を印刷する代わりに削除します。q終了すると残りのスクリプトがスキップされるため、これは最後の行で禁止されています。

あなたが持っている場合はNUM、変数では、あなたの代わりに、単一の二重引用符を使用したいと思うでしょう。

sed "${NUM}q;d" file

44
不思議に思う人にとって、このソリューションは、以下に提案されているsed -n 'NUMp'およびsed 'NUM!d'ソリューションよりも約6〜9倍速いようです。
Skippy le Grand Gourou 2014

75
tail -n+NUM file | head -n1は同じくらい速くなるか、より速くなると思います。少なくとも、50万行のファイルでNUMを250000にして試したところ、私のシステムでは(大幅に)高速でした。YMMVですが、なぜそうなるのか本当にわかりません。
rici 14年

2
@rici(以前のコメントの改訂)Linux(Ubuntu 12.04、Fedora 20)では、ファイルはまだキャッシュされていない場合に限り、使用catは確かに高速(ほぼ2倍高速)です。ファイルがキャッシュされると、パフォーマンスを維持したまま、ファイル名引数を直接使用する方が高速になります(約1/3高速)。不思議なことには、OS X 10.9.3上でこれのどれも任意の違いを確認するようだ:/いいえ、ファイルキャッシュされたかどうか。@anubhava:どういたしまして。catcatcat
mklement0 2014年

2
@SkippyleGrandGourou:この最適化の固有の性質を考えると、数値の範囲でさえ一般的なステートメントとして無意味です。唯一の一般的な要点は次のとおりです。(a)この最適化はすべての入力に安全に適用できます。(b)効果は、線全体の数と比較して求められる線のインデックスに応じて、なしから劇的な範囲になります。
mklement0 2014年

17
sed 'NUMq最初のNUMファイルを出力;dし、最後の行以外をすべて削除します。
anubhava

304
sed -n '2p' < file.txt

2行目を印刷します

sed -n '2011p' < file.txt

2011年ライン

sed -n '10,33p' < file.txt

10行目から33行目まで

sed -n '1p;3p' < file.txt

1行目と3行目

等々...

sedで行を追加するには、これを確認できます:

sed:特定の位置に行を挿入します


6
<この場合、@ RafaelBarbosaは必要ありません。簡単に言うと、それはリダイレクトを使用する私の好みsed -n '100p' < <(some_command)です。リダイレクトはシェル自体でforkするときにシェルで行われるため、それほど効果的ではありません。したがって、これは単なる設定です...(そして、はい、1文字長くなります):)
jm666 '27

1
@ jm666実際に、それはあなたが<:)使用していなかった場合には一つだけのスペースにoppposedとして<後「」あなたは通常、余分なスペースだけでなく、「<」を置くので、2つの文字長くだ
rasen58

2
@ rasen58スペースもキャラクター?:) /オーケー、冗談
ユア

1
もちろん、@ duhaime、誰かが最適化を行う必要がある場合。しかし、「一般的な」問題に対する私見はそれで問題はなく、その違いは目立ちません。また、head/ tailsed -n '1p;3p'シナリオを解決しません-別名より隣接していない行を印刷します...
jm666

1
もちろん@duhaime-メモは正確で必要です。:)
jm666 2018年

93

このページで提案されているソリューションをベンチマークできるという独特の状況があるので、この回答を、提案されたソリューションとそれぞれの実行時間を統合したものとして書いています。

セットアップ

行ごとに1つのキーと値のペアを含む3.261ギガバイトのASCIIテキストデータファイルがあります。ファイルには合計3,339,550,320行が含まれており、Vimを含め、私が試したエディターで開くことができません。私が発見したいくつかの値を調査するために、このファイルをサブセット化する必要があります。

ファイルには非常に多くの行があるため:

  • データで役立つことを行うには、行のサブセットのみを抽出する必要があります。
  • 気になる値に至るまでのすべての行を読むには、長い時間がかかります。
  • ソリューションが関心のある行を超えて読み取り、ファイルの残りの部分を読み取り続ける場合、約30億の無関係な行の読み取りに時間を浪費し、必要以上に6倍の時間がかかります。

私の最良のシナリオは、ファイル内の他の行を読み込まずにファイルから1行だけを抽出するソリューションですが、これをBashでどのように達成するかは考えられません。

私の正気のために、私は自分の問題に必要な5億行すべてを読み込もうとはしません。代わりに、3,339,550,320から行50,000,000を抽出しようとします(つまり、ファイル全体を読み取るには、必要以上に60倍の時間がかかります)。

timeビルトインを使用して各コマンドをベンチマークします。

ベースライン

最初にhead tail解決策を見てみましょう:

$ time head -50000000 myfile.ascii | tail -1
pgm_icnt = 0

real    1m15.321s

行5,000万のベースラインは00:01:15.321です。行5億をまっすぐに行った場合、おそらく〜12.5分になります。

切る

これは疑わしいですが、試してみる価値はあります。

$ time cut -f50000000 -d$'\n' myfile.ascii
pgm_icnt = 0

real    5m12.156s

これは実行に00:05:12.156かかりました。これはベースラインよりはるかに遅いです!停止する前にファイル全体を読み取ったのか、それとも最大5,000万行まで読み取ったのかはわかりませんが、これに関係なく、問題の実行可能な解決策のようには見えません。

AWK

exit完全なファイルが実行されるのを待つつもりがなかったので、私はソリューションを実行しただけです:

$ time awk 'NR == 50000000 {print; exit}' myfile.ascii
pgm_icnt = 0

real    1m16.583s

このコードは00:01:16.583で実行されました。これはわずか1秒遅いだけですが、それでもベースラインは改善されていません。この速度では、exitコマンドが除外されていた場合、ファイル全体を読み取るのに約76分かかります。

Perl

既存のPerlソリューションも実行しました。

$ time perl -wnl -e '$.== 50000000 && print && exit;' myfile.ascii
pgm_icnt = 0

real    1m13.146s

このコードは00:01:13.146で実行され、ベースラインよりも2秒程度高速です。5億個すべてで実行した場合、おそらく12分程度かかります。

sed

ボードの一番上の答え、これが私の結果です:

$ time sed "50000000q;d" myfile.ascii
pgm_icnt = 0

real    1m12.705s

このコードは00:01:12.705で実行されました。これは、ベースラインより3秒速く、Perlより〜0.4秒速いです。500,000,000行全体で実行した場合、おそらく12分程度かかります。

mapfile

bash 3.1を使用しているため、mapfileソリューションをテストできません。

結論

ほとんどの場合、head tailソリューションを改善するのは難しいようです。せいぜいこのsedソリューションでは、効率が最大3%向上します。

(式で計算されたパーセンテージ% = (runtime/baseline - 1) * 100

行50,000,000

  1. 00:01:12.705(-00:00:02.616 = -3.47%) sed
  2. 00:01:13.146(-00:00:02.175 = -2.89%) perl
  3. 00:01:15.321(+00:00:00.000 = + 0.00%) head|tail
  4. 00:01:16.583(+00:00:01.262 = + 1.68%) awk
  5. 00:05:12.156(+00:03:56.835 = + 314.43%) cut

行500,000,000

  1. 00:12:07.050(-00:00:26.160) sed
  2. 00:12:11.460(-00:00:21.750) perl
  3. 00:12:33.210(+00:00:00.000) head|tail
  4. 00:12:45.830(+00:00:12.620) awk
  5. 00:52:01.560(+00:40:31.650) cut

行3,338,559,320

  1. 01:20:54.599(-00:03:05.327) sed
  2. 01:21:24.045(-00:02:25.227) perl
  3. 01:23:49.273(+00:00:00.000) head|tail
  4. 01:25:13.548(+00:02:35.735) awk
  5. 05:47:23.026(+04:24:26.246) cut

4
ファイル全体を/ dev / nullに入れるだけでどれだけ時間がかかるのでしょうか。(これが単なるハードディスクのベンチマークだった場合はどうなりますか?)
sanmai 19/03/19

3つ以上のギグテキストファイルディクショナリを所有していることをお辞儀にしたいという不快な衝動を感じます。理論的根拠が何であれ、これにはテキスト性が含まれます:)
Stabledog

51

awkそれはかなり速いです。

awk 'NR == num_line' file

これがtrueの場合、デフォルトの動作awkが実行されます{print $0}


代替バージョン

ファイルが巨大な場合はexit、必要な行を読んだ後のほうがよいでしょう。このようにして、CPU時間を節約できます。回答の最後にある時間の比較を参照してください

awk 'NR == num_line {print; exit}' file

bash変数から行番号を指定する場合は、次のように使用できます。

awk 'NR == n' n=$num file
awk -v n=$num 'NR == n' file   # equivalent

exit特に行がファイルの最初の部分にある場合は、を使用してどれだけの時間を節約できるかを確認してください。

# Let's create a 10M lines file
for ((i=0; i<100000; i++)); do echo "bla bla"; done > 100Klines
for ((i=0; i<100; i++)); do cat 100Klines; done > 10Mlines

$ time awk 'NR == 1234567 {print}' 10Mlines
bla bla

real    0m1.303s
user    0m1.246s
sys 0m0.042s
$ time awk 'NR == 1234567 {print; exit}' 10Mlines
bla bla

real    0m0.198s
user    0m0.178s
sys 0m0.013s

したがって、差は0.198秒と1.303秒であり、約6倍高速です。


awkがフィールド分割を行おうとするため、この方法は常に遅くなります。フィールド分割のオーバーヘッドを削減できますawk 'BEGIN{FS=RS}(NR == num_line) {print; exit}' file
kvantour

この方法でのawkの真の力は、file1の行n1をfile2、n3またはfile3のn2を連結したいときに出てきますawk 'FNR==n' n=10 file1 n=30 file2 n=60 file3。GNU awkでは、これを使用して高速化できますawk 'FNR==n{print;nextfile}' n=10 file1 n=30 file2 n=60 file3
kvantour

@kvantour確かに、GNU awkのnextfileはそのようなものに最適です。どのように来るFS=RSことを回避するフィールド分割は?
fedorqui 'SO stop harming'

1
FS=RSフィールド分割を避けるが、それはたったの$ 0のものを解析し、何があるため、一方のフィールドのみが割り当てられませんRS$0
kvantour

@kvantour私はいくつかのテストをしてきました FS=RS、タイミングに違いはありませんでした。拡張できるように、私がそれについて質問するのはどうですか?ありがとう!
fedorqui 'SO stop harming'

29

私のテストによると、パフォーマンスと読みやすさの観点から、私の推奨は次のとおりです。

tail -n+N | head -1

N必要な行番号です。たとえばtail -n+7 input.txt | head -1、ファイルの7行目を印刷します。

tail -n+N行から始まるものが印刷されますN、そしてhead -1、それは1行の後に停止になります。


代替案head -N | tail -1は、おそらく少し読みやすくなります。たとえば、これは7行目を出力します。

head -7 input.txt | tail -1

パフォーマンスに関しては、サイズが小さくても大きな違いはありませんがtail | head、ファイルが大きくなると(上から)パフォーマンスが向上します。

トップ投票sed 'NUMq;d'は知っておくと面白いですが、頭と尾のソリューションよりも最初から理解できる人は少なく、尾/頭よりも遅いと私は主張します。

私のテストでは、両方のテール/ヘッドバージョンがsed 'NUMq;d'一貫してパフォーマンスを向上させました。これは、投稿された他のベンチマークと一致しています。テール/ヘッドが本当に悪かったケースを見つけるのは難しいです。これらは最近のUnixシステムで大幅に最適化されることが予想される操作であるため、これも驚くべきことではありません。

パフォーマンスの違いについてのアイデアを得るために、これらは私が巨大なファイル(9.3G)について取得する数です:

  • tail -n+N | head -1:3.7秒
  • head -N | tail -1:4.6秒
  • sed Nq;d:18.8秒

結果は異なる場合がありますが、パフォーマンス head | tailtail | head、一般的に、小さい入力に対して同等であり、sed重要な要因(5X周り程度)によって常に遅いです。

私のベンチマークを再現するために、以下を試すことができますが、現在の作業ディレクトリに9.3Gファイルが作成されることに注意してください。

#!/bin/bash
readonly file=tmp-input.txt
readonly size=1000000000
readonly pos=500000000
readonly retries=3

seq 1 $size > $file
echo "*** head -N | tail -1 ***"
for i in $(seq 1 $retries) ; do
    time head "-$pos" $file | tail -1
done
echo "-------------------------"
echo
echo "*** tail -n+N | head -1 ***"
echo

seq 1 $size > $file
ls -alhg $file
for i in $(seq 1 $retries) ; do
    time tail -n+$pos $file | head -1
done
echo "-------------------------"
echo
echo "*** sed Nq;d ***"
echo

seq 1 $size > $file
ls -alhg $file
for i in $(seq 1 $retries) ; do
    time sed $pos'q;d' $file
done
/bin/rm $file

これが私のマシンでの実行の出力です(SSDと16Gのメモリを搭載したThinkPad X1 Carbon)。最終的な実行では、すべてがディスクからではなく、キャッシュから取得されると思います。

*** head -N | tail -1 ***
500000000

real    0m9,800s
user    0m7,328s
sys     0m4,081s
500000000

real    0m4,231s
user    0m5,415s
sys     0m2,789s
500000000

real    0m4,636s
user    0m5,935s
sys     0m2,684s
-------------------------

*** tail -n+N | head -1 ***

-rw-r--r-- 1 phil 9,3G Jan 19 19:49 tmp-input.txt
500000000

real    0m6,452s
user    0m3,367s
sys     0m1,498s
500000000

real    0m3,890s
user    0m2,921s
sys     0m0,952s
500000000

real    0m3,763s
user    0m3,004s
sys     0m0,760s
-------------------------

*** sed Nq;d ***

-rw-r--r-- 1 phil 9,3G Jan 19 19:50 tmp-input.txt
500000000

real    0m23,675s
user    0m21,557s
sys     0m1,523s
500000000

real    0m20,328s
user    0m18,971s
sys     0m1,308s
500000000

real    0m19,835s
user    0m18,830s
sys     0m1,004s

1
間のパフォーマンスの異なるhead | tail対はtail | head?それとも、どの行が印刷されているか(ファイルの先頭とファイルの終わり)によって異なりますか?
wisbucky

1
@wisbucky私には明確な数字はありませんが、最初にテールを使用し、その後に「ヘッド-1」を使用することの欠点の1つは、事前に全長を知る必要があることです。それがわからない場合は、最初に数える必要があります。これはパフォーマンス面での損失になります。もう1つの欠点は、使用するのが直感的でないことです。たとえば、1から10までの数字があり、3行目を取得したい場合は、「tail -8 | head -1」を使用する必要があります。これは、「ヘッド-3 |テール-1」よりもエラーが発生しやすくなります。
フィリップ・Classenの

申し訳ありませんが、明確にするために例を含める必要がありました。head -5 | tail -1tail -n+5 | head -1。実際、私はテスト比較を行う別の答えを見つけtail | head、より高速であることがわかりました。stackoverflow.com/a/48189289
wisbucky 2018年

1
@wisbucky言及していただきありがとうございます!私はいくつかのテストを行いましたが、見たものとは関係なく、ラインの位置に関係なく、常にわずかに高速であったことに同意する必要があります。それを踏まえて、私は私の答えを変更し、誰かがそれを再現したい場合に備えてベンチマークも含めました。
フィリップ・Classenの

27

うわー、すべての可能性!

これを試して:

sed -n "${lineNum}p" $file

または、Awkのバージョンに応じて次のいずれか:

awk  -vlineNum=$lineNum 'NR == lineNum {print $0}' $file
awk -v lineNum=4 '{if (NR == lineNum) {print $0}}' $file
awk '{if (NR == lineNum) {print $0}}' lineNum=$lineNum $file

またはコマンドを試す必要がある場合がありますnawkgawk)。

特定の行のみを印刷するツールはありますか?標準的なツールではありません。ただし、sedおそらく最も近く、最も簡単に使用できます。



21

この質問はBashとタグ付けされていますが、これはBash(≥4)の実行方法です。(スキップ)と(カウント)オプションを使用mapfileします。-s-n

ファイルの42行目を取得する必要がある場合file

mapfile -s 41 -n 1 ary < file

この時点で、(末尾の改行aryを含む)の行を含むフィールドの配列がありfile、最初の41行をスキップし(-s 41)、1行を読み取った後に停止しました(-n 1)。つまり、これが実際の42行目です。印刷するには:

printf '%s' "${ary[0]}"

行の範囲が必要な場合は、42から666の範囲(両端を含む)で、自分で計算したくないと言って、標準出力に出力します。

mapfile -s $((42-1)) -n $((666-42+1)) ary < file
printf '%s' "${ary[@]}"

これらの行も処理する必要がある場合は、末尾の改行を保存するのはあまり便利ではありません。この場合、-tオプション(トリム)を使用します。

mapfile -t -s $((42-1)) -n $((666-42+1)) ary < file
# do stuff
printf '%s\n' "${ary[@]}"

あなたは関数にそれをさせることができます:

print_file_range() {
    # $1-$2 is the range of file $3 to be printed to stdout
    local ary
    mapfile -s $(($1-1)) -n $(($2-$1+1)) ary < "$3"
    printf '%s' "${ary[@]}"
}

外部コマンドはなく、Bashビルトインのみ!


11

sed printを使用して終了することもできます。

sed -n '10{p;q;}' file   # print line 10

6
この-nオプションを使用すると、デフォルトのアクションが無効になり、すべての行が印刷されます。これは、manページを一目見ただけでわかるはずです。
tripleee 2013

ではGNU sed全てsedの答えはほぼ同じ速度です。したがって(GNUの場合 sedsed大きなファイルと小さなn番目の行の値の時間を節約できるため、これが最良の答えです。
agc 2017


6

大きなファイルの最速の解決策は、2つの距離がある場合、常にtail | headです。

  • ファイルの先頭から開始行まで。それを呼ぼうS
  • 最終行からファイルの終わりまでの距離。なるE

知られています。次に、これを使用できます:

mycount="$E"; (( E > S )) && mycount="+$S"
howmany="$(( endline - startline + 1 ))"
tail -n "$mycount"| head -n "$howmany"

howmanyは必要な行数です。

https://unix.stackexchange.com/a/216614/79743の詳細


1
Sおよびの単位E(バイト、文字、または行)を明確にしてください。
agc 2017

6

上記のすべての答えが直接質問に答えます。しかし、ここでは直接的な解決策ではありませんが、考えを誘発するための、より重要な可能性のあるアイデアを示します。

行の長さは任意であるため、n番目の行の前のファイルのすべてのバイトを読み取る必要があります。巨大なファイルがある場合、またはこのタスクを何度も繰り返す必要があり、このプロセスに時間がかかる場合は、最初にデータを別の方法で保存する必要があるかどうかを真剣に検討する必要があります。

実際の解決策は、たとえばファイルの先頭に、行の開始位置を示すインデックスを付けることです。データベース形式を使用することも、ファイルの先頭にテーブルを追加することもできます。または、大きなテキストファイルに付随する別のインデックスファイルを作成します。

たとえば、改行の文字位置のリストを作成できます。

awk 'BEGIN{c=0;print(c)}{c+=length()+1;print(c+1)}' file.txt > file.idx

次に、で読み取りますtail。これは、実際seekにはファイル内の適切な場所に直接移動します。

たとえば、1000行目を取得するには:

tail -c +$(awk 'NR=1000' file.idx) file.txt | head -1
  • これは2バイト/マルチバイト文字では機能しない可能性があります。awkは「文字認識」ですが、末尾は認識されないためです。
  • 大きなファイルに対してこれをテストしていません。
  • この回答もご覧ください。
  • または、ファイルを小さなファイルに分割してください!

5

CaffeineConnoisseurの非常に役立つベンチマーク回答のフォローアップとして...「mapfile」メソッドが他のメソッドと比較された速度(それはテストされていなかったため)に興味があったので、次のように自分ですばやくダーティな速度比較を試みました私はbash 4を持っています。人々が賞賛を歌っているので、私がそこにいたときにトップアンサーのコメントの1つで言及された "head | tail"ではなく "tail | head"メソッドのテストを投げました。使用するテストファイルのサイズに近いサイズのものはありません。私がすぐに見つけた最高のものは、1400万の血統ファイル(空白で区切られた長い行で、12000行未満)でした。

短いバージョン:mapfileは、cutメソッドよりも高速に表示されますが、他のすべてよりも低速なので、私はそれをおかしな名前と呼びます。尾| ヘッド、OTOHは、最速のように見えますが、このサイズのファイルでは、sedと比べてそれほど大きな違いはありません。

$ time head -11000 [filename] | tail -1
[output redacted]

real    0m0.117s

$ time cut -f11000 -d$'\n' [filename]
[output redacted]

real    0m1.081s

$ time awk 'NR == 11000 {print; exit}' [filename]
[output redacted]

real    0m0.058s

$ time perl -wnl -e '$.== 11000 && print && exit;' [filename]
[output redacted]

real    0m0.085s

$ time sed "11000q;d" [filename]
[output redacted]

real    0m0.031s

$ time (mapfile -s 11000 -n 1 ary < [filename]; echo ${ary[0]})
[output redacted]

real    0m0.309s

$ time tail -n+11000 [filename] | head -n1
[output redacted]

real    0m0.028s

お役に立てれば!


4

他の人が言ったことを使用して、私はこれを私のbashシェルで素早くダンディな機能にしたかったのです。

ファイルを作成します。 ~/.functions

それにコンテンツを追加します。

getline() { line=$1 sed $line'q;d' $2 }

次にこれをあなたに追加してください~/.bash_profile

source ~/.functions

新しいbashウィンドウを開いたら、次のように関数を呼び出すだけです。

getline 441 myfile.txt


3

\ n(通常は新しい行)で区切られた複数の行がある場合。'cut'も使用できます。

echo "$data" | cut -f2 -d$'\n'

ファイルから2行目を取得します。-f33行目を与えます。


1
複数行の表示にも使用できます。FILEのcat FILE | cut -f2,5 -d$'\n'2行目と5行目を表示します。(ただし、順序は保持されません。)
Andriy Makukha

2

変数を行番号としてsedを使用してn番目の行を印刷するには、次のように入力します。

a=4
sed -e $a'q:d' file

ここで「-e」フラグは、実行するコマンドにスクリプトを追加するためのものです。


2
コロンは構文エラーであり、セミコロンでなければなりません。
トリプルリー

2

すでに良い答えがたくさんあります。個人的にはawkを使います。便宜上、bashを使用する場合は、以下をに追加してください~/.bash_profile。そして、次回ログインしたとき(またはこの更新後に.bash_profileを入手した場合)、ファイルをパイプするための新しい気の利いた「n番目」の関数が利用できるようになります。

これを実行するか、〜/ .bash_profileに入れて(bashを使用している場合)、bashを再度開きます(またはを実行しますsource ~/.bach_profile

# print just the nth piped in line nth () { awk -vlnum=${1} 'NR==lnum {print; exit}'; }

次に、それを使用するために、単にそれを介してパイプします。例えば、:

$ yes line | cat -n | nth 5 5 line


1

見とった後、トップの答えベンチマークを、私は小さなヘルパー関数を実装しました:

function nth {
    if (( ${#} < 1 || ${#} > 2 )); then
        echo -e "usage: $0 \e[4mline\e[0m [\e[4mfile\e[0m]"
        return 1
    fi
    if (( ${#} > 1 )); then
        sed "$1q;d" $2
    else
        sed "$1q;d"
    fi
}

基本的には、次の2つの方法で使用できます。

nth 42 myfile.txt
do_stuff | nth 42

0

上記の回答のいくつかを短いbashスクリプトに入れました。このbashスクリプトは、呼び出されget.shてリンクされるファイル/usr/local/bin/get(または他の任意の名前)に入れることができます。

#!/bin/bash
if [ "${1}" == "" ]; then
    echo "error: blank line number";
    exit 1
fi
re='^[0-9]+$'
if ! [[ $1 =~ $re ]] ; then
    echo "error: line number arg not a number";
    exit 1
fi
if [ "${2}" == "" ]; then
    echo "error: blank file name";
    exit 1
fi
sed "${1}q;d" $2;
exit 0

それが実行可能であることを確認してください

$ chmod +x get

上で使用できるようにリンクPATHして

$ ln -s get.sh /usr/local/bin/get

責任を持って楽しんでください!

P

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.