2016-11-30 12 views
0

私はbashスクリプトの構文には使用しません。私はファイルを読むことを試みている。各行について、文字列の一部分のみを区切り記号 '/'の前に置いて、単語がperticularの長さを尊重すれば新しいファイルに戻したいと思います。私は辞書をダウンロードしましたが、フォーマットは私の期待を満たしていません。 84000語があるので、私は実際に各単語の '/'の後に何が削除されるのかを手動で取り除きたいとは思わない。私は簡単なことですが、私はこのサイトの他の同様の質問でいくつかのアイデアに従っていますが、まだ動作しないため、どこかで何かが見つからないようです。私は長さの権利を得ることができません。 Test_Inputファイルには、1行に1語が含まれています。ここでは、コードがあります:bashスクリプトでの文字列操作のヘルプが必要

#!/usr/bin/bash 
filename="Test_Input.txt" 
while read -r line 
do 
    sub= echo $line | cut -d '/' -f1 
    length= echo ${#sub} 
    if $length >= 4 && $length <= 10; 
     then echo $sub >> Test_Output.txt 
    fi 
done < "$filename" 
+0

THXしかし、他の誰かがそれをうまく:) – David

答えて

0

いくつかの項目:

  1. 私は、これは確かに失敗しただろうとあなたは、割り当てに単一のバッククォートを使用して、なく文字通りsub= echo $line | cut -d '/' -f1されていることを前提としています。次のポイントに私をもたらしif [[ $length -ge 4 ]] && [[ $length -le 10 ]];
  2. <=は確実にない、このように、シングルまたはダブル[]に包含されることを
  3. if句を必要としている条件を$(echo $line | cut -d '/' -f1)に代わり、あなたも同様に、sub=$()を使用することができますbashで動く「より大きいか等しい」には-geを、「それ以下」には-leを使用してください。
  4. あなたの行に/文字が含まれていない場合は、バージョンsubに行全体が含まれます。これはあなたが望むものではない可能性がありますので、-sフラグをcutに追加することをおすすめします。
  5. somevar=$(echo $someothervar)は必要ありません。ただ、ここで働くバージョンだsomevar=$someothervar

を使用します。もちろん

#!/usr/bin/env bash 
filename="Test_Input.txt" 
while read -r line 
do 
    sub=$(echo $line | cut -s -d '/' -f 1) 
    length=${#sub} 
    if [[ $length -ge 4 ]] && [[ $length -le 10 ]]; 
     then echo $sub >> Test_Output.txt 
    fi 
done < "$filename" 

が、あなたはまた、単にsedを使用することができます。

sed -n -r '/^[^/]{4,10}\// s;/.*$;;p' Test_Input.txt > Test_Output.txt 

説明:

  • -nドン」明示的に指定しなければ何も印刷しない印刷用にked。
  • -r使用特定の基準に一致し、この操作実行回線の拡張正規表現
  • /<searchterm>/ <operation>検索:
    • 検索語である:行の先頭から^[^/]{4,10}\/は、4〜10の非存在であるべきです-slash文字の後にスラッシュを続けます。
    • 操作:s;/.*$;;p最初のスラッシュと行末の間のすべてを何も置き換えずに印刷します。
+0

ほんの少しの精度のための最高のツールである、二重のは、 '[['で動作しませんでしたすべて、私は単一のものを使用します。どうもありがとうございました!私はそれほど遠くないと知っていた! :) – David

+0

最後に '[['うまく動作! 'bash。/ script.sh'ではなく' sh。/ script.sh'で私たちのスクリプトを読み込むのは、それほど互換性がないと思われます。 – David

0

awkこの

awk -F/ 'length($1) >= 4 && length($1) <= 10 {print $1} > newfile