2014-01-09 36 views
1

的組合來分隔:LIST.TXT包含真難看的數據,像這樣:如何。如果文件分割字符串或文件可以通過評論和空格,製表符,換行符,逗號或其他字符

aaaa 
#bbbb 
cccc, dddd; eeee 
ffff; 
    #gggg hhhh 
iiii 

jjjj,kkkk ;llll;mmmm 
nnnn 

我們如何使用bash腳本解析/拆分該文件,不包括註釋行,用所有逗號,分號和所有空格(包括製表符,空格和換行符以及carrage-return字符)對它們進行分隔?

回答

1

使用shell命令:

grep -v "^[ |\t]*#" file|tr ";," "\n"|awk '$1=$1' 
+1

您能否讓您的答案更具描述性?例如,解釋它爲什麼有效,每個參數等代表什麼。這將使您的答案對未來的讀者更有價值,並幫助教授OP。 –

+0

我不確定你有什麼問題,grep,tr,awk都是流行的shell命令,我不是在這裏教一些東西。人們可以在谷歌搜索大量樣本,以瞭解這些命令,如果他們想學習。爲什麼我們需要把他們當成嬰兒? – BMW

+0

這是一個很好的竅門,除了我會這樣寫它以獲得它到一個可用的數組:array = \'grep -v「[^ | \ t] *#」list.txt | tr「;,」「\ n「| awk'$ 1 = $ 1''現在我將嘗試解釋它是如何工作的:grep命令返回所有不符合空格的註釋模式的行,從而導致#char。 tr命令然後交換「;」的所有實例或「,」換成新的。 awk命令是一個漂亮的技巧,可以從行中刪除前導和尾隨空白。因此,你留下了所需的數據... –

1

,可以用下面的代碼來完成:

#!/bin/bash 
### read file: 
file="list.txt" 

IFSO=$IFS 
IFS=$'\r\n' 
while read line; do 
    ### skip lines that begin with a "#" or "<whitespace>#" 
    match_pattern="^\s*#" 
    if [[ "$line" =~ $match_pattern ]]; 
     then 
     continue 
    fi 

    ### replace semicolons and commas with a space everywhere... 
    temp_line=(${line//[;|,]/ }) 

    ### splitting the line at whitespaces requires IFS to be set back to default 
    ### and then back before we get to the next line. 
    IFS=$IFSO 
    split_line_arr=($temp_line) 
    IFS=$'\r\n' 
    ### push each word in the split_line_arr onto the final array 
    for word in ${split_line_arr[*]}; do 
      array+=(${word}) 
    done 
done < $file 

echo "Array items:" 
for item in ${array[*]} ; do 
    printf " %s\n" $item 
done 

這是不是提出一個問題,而是一個更好的解決方案已回答其它相關問題時,在感動別人。這裏獨一無二的是,那些其他問題/解決方案並沒有真正解決如何在用空格,字符和註釋組合分隔字符串時如何分割字符串;這是一個解決方案,滿足所有三個同時...

相關問題:

How to split one string into multiple strings separated by at least one space in bash shell?

How do I split a string on a delimiter in Bash?

其他注意事項:

爲什麼這樣做在bash當其他腳本語言更適合分裂?與perl程序相比,bash腳本更可能擁有從基本的新貴或cron(sh)shell運行時所需的所有庫。在這些情況下經常需要一個參數列表,我們應該期望那些維護這些列表的人最糟糕......

希望這篇文章可以節省bash新手很多時間在未來(包括我)...好運氣!

0

,如果你有紅寶石您的系統上

File.open("file").each_line do |line| 
    next if line[/^\s*#/] 
    puts line.split(/\s+|[;,]/).reject{|c|c.empty?} 
end 

輸出

# ruby test.rb 
aaaa 
cccc 
dddd 
eeee 
ffff 
iiii 
jjjj 
kkkk 
llll 
mmmm 
nnnn 
1

sed 's/[# \t,]/REPLACEMENT/g' input.txt

  • 上面的命令替換註釋字符('#'),空間(' '),標籤('\t')和逗號(',')與任意字符串('REPLACEMENT'

  • 替換換行符,你可以嘗試:

sed 's/[# \t,]/replacement/g' input.txt | tr '\n' 'REPLACEMENT'

+0

這並不真正忽視評論。它只是使用「#」字符作爲分隔符... –

+0

如果您想忽略註釋,請嘗試'$ YOUR-CMD-HERE | grep -v'^#''。這會忽略以'#'開頭的行 – csiu

相關問題