2016-11-30 25 views
0

我對bash腳本的語法沒有用處。我正在嘗試閱讀文件。對於每一行,我希望只保留分隔符「/」之前的字符串部分,並且如果該詞尊重特定長度,則將其放回到新文件中。我已經下載了一本字典,但格式不符合我的期望。由於有84000個單詞,因此我不想在每個單詞的'/'之後手動刪除它。我雖然這將是一件容易的事情,並且我在本網站的其他類似問題上遵循了一些想法,但似乎我在某處丟失了某些東西,因爲它仍然不起作用。我無法得到正確的長度。文件Test_Input每行包含一個字。下面的代碼:需要在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,因爲這將有一定失敗。或者,你也可以用sub=$(),如$(echo $line | cut -d '/' -f1)
  2. if條款所需要的條件,通過單人或雙人[]涵蓋,這樣的:if [[ $length -ge 4 ]] && [[ $length -le 10 ]];
  3. 這使我下一個問題:<=不可靠在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別除非明確表示要打印任何東西打印。
  • -r使用擴展的正則表達式
  • /<searchterm>/ <operation>搜索符合一定條件的,並執行該操作線:
    • 搜索關鍵詞是:^[^/]{4,10}\/從行的開頭,應該有非4和10之間 - 斜線後面加斜槓
    • 操作是:s;/.*$;;p用空白替換第一個斜槓和行尾之間的所有內容,然後打印。
+0

只是一點點精度,雙'[['沒工作所有,我使用單一的。非常感謝你!我知道我不是很遠! :) – David

+0

終於'[['工作好!似乎用'sh。/ script.sh'而不是'bash。/ script.sh'來加載我們的腳本具有較低的兼容性。 – David

0

awk是這個

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