2017-01-30 17 views
0

位數我有文件包含數字。我必須循環並檢查文件中的每個數字是否包含11位數字。 如果找到的數字包含少於/多於11個數字,則應將此數字寫入輸出文件。檢查在一些

這裏是我的嘗試:

number="$(< all_numbers.txt)" 
for numbers in $number ; 
do 
    if [${#numbers} == 11]; 
    then 
     echo $numbers = "${#numbers}" > num.txt; 
    fi; 
done; 

,當我運行我的代碼,我得到以下錯誤:

-bash: [11: command not found

+1

您是否嘗試在'['和'$'之間添加空格? –

+0

是的,但我得到''''-bash:[:missing']''''' – Fshamri

+1

並且在關閉']之前有一個空格? –

回答

1

UNIX使用-eq比較數字。 「==」用於字符串。 我認爲你可以避免大部分分號。

所以你的腳本應該是:

number="$(< all_numbers.txt)" 
for numbers in $number 
do 
    if [ ${#numbers} -eq 11 ]; then 
     echo $numbers = "${#numbers}" > num.txt 
    fi 
done 

Update

如果你需要不等於(大於或小於小)11元,簡單地改變條件[ ${#numbers} -ne 11 ]


Update 2: Adding additional checks:

number="$(< all_numbers.txt)" 
for numbers in $number 
do 
    if [[ ! ${#numbers} =~ ^93 ]] ; then 
     echo $numbers = "${#numbers}" > num93.txt 
    fi 
    if [ ${#numbers} -ne 11 ]; then 
     echo $numbers = "${#numbers}" > num.txt 
    fi 
done 

希望這^ h ELPS!

+0

想要把所有數字都小於或大於11位數放在一個外部文件中 – Fshamri

+0

''''if [! $ {#numbers} -eq 11]; '''幫助 – Fshamri

+0

看到更新的答案。你可以簡單地使用'-ne'而不是'-eq' – anacron

0

你說數字應該寫入輸出文件,如果是的話不是由11位數字組成。你必須反轉邏輯。

因爲你似乎使用bash,方法很多人做這將是

((${#numbers} == 11)) || echo $number >num.txt 

注意,這會考慮00000000001爲11位號碼。你的帖子並沒有說明這是否真的是你想要達到的。

還要注意的是這個解決方案,像你的方法,不檢查數據是否真的是一個數字。一串11個字母也將被視爲數字。

當然,你也可以得到完全通過編寫

grep -vE '^.{11}$' >num.txt 

如果你還需要檢查數字和過濾掉非數字擺脫循環,你可以做

grep -vE '^[0-9]{11}$' >num.txt 
0

我喜歡測試號碼時使用雙重否定,以便非數字得到適當的拒絕:

for number in $(cat all_numbers.txt) 
do 
    if ! [ "$number" -lt 10000000000 ] 2>/dev/null 
    then 
     echo "$number = '${#number}'" 
    fi 
done > num.txt 

我已經改變了變量名稱,因爲你有一個複數「數字」是指每個單獨的數字。此代碼有一個單獨的$number來指示來自輸入文件的每個迭代。我還用數學來確保我們只算與十一位數(大於或等於100億),但是使用同一個可變長度的計算爲原來的問題,當涉及到顯示輸出。

我猜你不想每次都覆蓋文件,讓我感動你的輸出到外循環。您也可以在回波行末尾使用>> num.txt,但實際上在輸入文件中每個數字會打開一次文件,效率不高。

我在這裏寫的代碼也是POSIX兼容的(沒有bashisms,它可以在dash中正常工作)。請注意,舊的商業UNIX可能會抱怨大於2 3¹的數字(最大帶符號的32位整數)。

相關問題