2014-01-06 49 views
0

我有一個文件,其中包含一個名稱列表。我正在嘗試搜索具有特定字符串組的名稱,並將它們打印到shell中的新文件中。你能幫忙嗎?在shell中搜索文件中的一部分字符串

這是我正在看的。 文本文件(names.txt中)包含像

New York_USA 
Delhi 
Moscow 
Tokyo 
Austin_USA 
Beijing 
Chicago_USA 

我試圖讓與_USA的名字在一個單獨的文件名。 這是我曾嘗試

#/bin/ksh 
for city in "cat names.txt" 
do 
if ["$city" =~ "*_USA"] 
then 
echo "$city in USA" > USAnames.txt 
fi 
done 
+1

你爲什麼不簡單'grep _USA names.txt'?或者,如果你真的堅持重新格式化輸出,可以在USA/p'names.txt中選擇'sed -n's/_USA $ /&'? – tripleee

回答

0

你只需要執行cat命令,而不是引用它,解決您的測試運算符([ - > [[),並追加>>而不是覆蓋>,寫正則表達式,而不是glob模式:

#/bin/ksh 
for city in `cat names.txt` # notice the back quotes 
do 
if [[ "$city" =~ .*_USA ]] 
then 
echo "$city in USA" >> USAnames.txt 
fi 
done 

更習慣的方法或許會是:

#/bin/ksh 
while read city 
do 
if [[ "$city" =~ .*_USA ]] 
then 
echo "$city in USA" >> USAnames.txt 
fi 
done < names.txt 
+0

感謝您的回覆。但我試過這種方式。我根本沒有得到任何輸出。我認爲如果條件不明確。有沒有其他辦法可以實現? – user3164754

+0

我對代碼進行了一些編輯,再次檢查,現在應該可以工作。你有多個問題... –

+0

好的,修正了最後一個問題:if條件中應該沒有引號,如果條件爲 –

0

使用awk或如果你想輸出是這樣

New York_USA in USA 
Austin_USA in USA 
Chicago_USA in USA 

使用將更容易

awk '/_USA$/ {print $0, "in USA"}' names.txt > USAnames.txt 

sed

sed -n 's/\(.*\)_USA$/\0 in USA/p' names.txt > USAnames.txt 

,或者如果你想輸出爲

New York in USA 
Austin in USA 
Chicago in USA 

使用

awk -F_ '/_USA$/ {print $1,"in USA"}' names.txt > USAnames.txt 

sed

sed -n 's/\(.*\)_USA$/\1 in USA/p' names.txt > USAnames.txt 

編輯
你也可以使用Perl打印出美國城市

#!/usr/bin/env perl 
open(NAMES, "names.txt"); 
    while (<NAMES>) { 
    chomp; 
    print "$_ in USA\n" if /_USA$/; # Chicago_USA in USA 
    # print "$1 in USA\n" if /(.*)_USA$/; # Chicago in USA 
} 
close(NAMES); 
+0

我正試圖在perl中實現相同的功能。我正在使用正則表達式,如 if($ city =〜m/^(_ USA)/){ print $ city;} 但是沒有得到輸出。 – user3164754

+0

我不知道如何在perl中獲得'$ city'。我用Perl代碼更新了我的帖子。 – ray

0

只需使用grep:

grep '_USA$' your_file> new_file