2015-07-20 102 views
0

我有一個與以空格保存的以逗號分隔的值文件(.csv)相關的bash相關的問題作爲選定的分隔符。在bash中從空格分隔的CSV文件中查找特定單元格

例如,我會在這裏把小.csv文件:

A B C D 
1 a b c d 
2 e f g h 
3 i j k l 
4 m n o p 

這裏是我的問題:這有可能在bash讀取例如從小區C4特定值?

試圖找到有類似問題,但不能它的任何主題。

在此先感謝!

+0

CSV文件不是Excel特定的格式。當你說「excel」時,你會讓人們認爲你在談論.xls或.xlsx,這是一個非常不同的問題(對於那些你想要使用Python,它有一些非常好的解析器可用)。這就是說 - 對於bash而言,最簡單的解決方案稍微不準確,如果您的單元格中包含逗號,則無法正常工作。你知道這是否有可能嗎? –

+0

其實我把.csv文件與空格,因爲在我的Excel設置我有選項來顯示這些文件作爲正常的Excel文件。我假設沒有這個設置,所有的值應該用逗號分開。 – nemox007

+0

並且您的實際文件將以這種方式保存,因此它不僅僅用於演示目的?那有效。 (儘管這意味着如果你的任何數據包含空格,我們需要知道它以給出正確的答案)。 –

回答

2

能在awk中做到這一點很容易:

example.sh

#!/bin/bash 

awk ' 
{ 
    if(NR==5){ print $4; } 
} 
' < "$1" 

輸出

$ ./example.sh input.txt 
o 

細節

  • NR濾波器的行號
  • $ 4參照第四字段(在C柱)
+0

請使用'... <「$ 1」'或'<「$ 1」...'而不是'cat $ 1 | ...'更有效率(因爲它給'awk'一個文件的直接句柄,而不是通過從文件讀取'cat'進程的管道的句柄),並且也更少錯誤(不引用文件名意味着它受到字符串分裂和匹配的影響)。建議修正 –

+0

以修復多餘的io。在csv的問題上,雖然即將出現的RFC規範似乎包括使用更通用的分隔符([csv-wikipedia](https://en.wikipedia.org/wiki/Comma-separated_values)),但通常csv是逗號分隔的。 – amdixon

+0

的確,我意識到這一點 - Python CSV模塊支持備用分隔符,但是當OP指出它是「Excel文件」時,我做了一個假設(然後是合理的),他們使用了Excel的默認變體CSV格式。 –

0

棘手的部分是轉換成"C4"column 3, row 4。以下是bash的一種方式:

#!/bin/bash 

cell=$1 
file=$2 

colnum() { 
    local -u col=$1 
    local val=0 i 
    for ((i=0; i<${#col}; i++)); do 
     # ascii value of a char, ref: http://stackoverflow.com/q/890262/7552 
     printf -v ascii "%d" "'${col:i:1}" 
     val=$((val*26 + ascii - 64)) 
    done 
    echo "$val" 
} 

if ! [[ $cell =~ ^([A-Za-z]+)([0-9]+)$ ]]; then 
    echo "error: invalid cell '$cell'" 
    exit 1 
fi 

col=$(colnum "${BASH_REMATCH[1]}") 
row=${BASH_REMATCH[2]} 
lineno=0 

while read -ra fields; do 
    if ((++lineno == row)); then 
     echo "${fields[col-1]}" 
    fi 
done < "$file" 
相關問題