2016-03-21 5 views
1
size=$(wc -l < "$1") 
    if [ "$size" -gt 0 ] 
    then 
     tr "[:lower:]" "[:upper:]" < $1 > output 
     for ((i=1; i <= "$size"; ++i)) 
     do 
      echo "Line " $i $(head -"$i" > output | tail -1 > output) 
     done 

こんにちは、みんな! 私はこの小さなコードに問題があります。ヘッドテールのものを除いてすべてがうまくいきます。私がしたいのは、ファイルから行番号 "i"を表示するだけです。 私が受け取った結果はちょうど最後の行($ size)です。head-tail操作のファイルでパイプを使用するには?

私はたぶんテールの入力に間違っていると思います。ヘッド - "$ i"は指定された行には行きません。 :( 任意の考え

Ohhhh ...私はちょうど実現:?。。私の尾のための入力が、私はそれを行うにはどうすればよいヘッド ソリューションは尾に頭からの結果を与えることであるため、同じ入力を与えると? : - 。/

+0

非常に最初のポストを見てみましょう。http://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file 限り、それがために働くよう最後の行は、すべての行で動作する必要があります。実行のスピードは私に影響を与えない、私は小さなファイルがあります。だから私はsedを使いたくない。 – Marko

答えて

1

あなたはheadからoutputをファイルにリダイレクトする必要はありません!。そうでなければ、パイプは入力をまったく取得しません。また、>>に結果を追加すると、ループの次の繰り返しでファイルを上書きし続けるだけです。ただし、スクリプトを呼び出すたびに出力ファイルを削除してください。そうしないと、出力ファイルに無限に追加し続けるだけです。

echo "Line " $i $(head -"$i" $infile | tail -1 >> output) 
+0

この場合、正確に何をしますか? – Marko

+0

'' 'はファイルへの出力の追加に使用されます。したがって、ファイルがすでに存在する場合は、既存のコンテンツを消去せずに返されたファイルに新しい行が追加されます。 '> 'はファイルの内容を消去し、新しい行を追加します。ですから、ループ内で '>'を使うと、最後の反復からの出力しか得られません。これを防ぐには '>>'を使います。 – Munir

+0

Ohh..thatsなぜ私は最後の行を得ていたのですか?わかった。ありがとうございました! – Marko

0

私は、あなたがもしそうなら、awk救助に接頭辞「ライン」とcat -nを再実装していると思う

awk '{print "Line "NR, tolower($0)}' 
+0

awkはテキストを見つけて置き換えますが、私は行番号($ i)をエコーし​​て、行自体もエコーしますが、最後の行だけで動作します。 私はパイプのものを修理したいのですが、別のコマンドを使っていません。 – Marko

+0

Ohhhh ...私はちょうど実現した:私の尾の入力として私は頭のための同じ入力を与える。解決策は頭部からの結果を尾部に与えることである。それ、どうやったら出来るの? : -/ – Marko

+0

'awk'はテキストを置き換えず、入力を取り、出力を生成します。あなたのパイプコマンドは壊れています。なぜならそれはパイプのためではないからです。 head>が最初の部分から '> output'を取り除きたいとします。 – karakfa

0

私は作った。 :D

トリックはそのように、尾のために入力されます別のファイルにヘッドの出力を置くことです:

echo "Line " $i $(head -"$i" <output>outputF | tail -1 < outputF) 

あなたの質問は、私は違った考えさせられました。ありがとうございました!

+0

これは、不要な余分なプロセスやファイルI/Oがたくさんあるため、実際には効率的ではありません。 – chepner

1

readを使用して、ファイルから入力行をフェッチします。

# Since `1` is always true, essentially count up forever 
for ((i=1; 1; ++i)); do 
    # break when a read fails to read a line 
    IFS= read -r line || break 
    echo "Line $i: $(tr [:lower:] [:upper:])" 
done < "$1" > output 

より標準的な方法は、ファイルを繰り返し処理し、iを明示的に維持することです。

i=1 
while IFS= read -r line; do 
    echo "Line $i: $(tr [:lower:] [:upper:])" 
    ((i++)) 
done < "$1" > output 
+0

実際、最後の方法が最も簡単です。 – Marko

関連する問題