我有一個與以空格保存的以逗號分隔的值文件(.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特定值?
試圖找到有類似問題,但不能它的任何主題。
在此先感謝!
我有一個與以空格保存的以逗號分隔的值文件(.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特定值?
試圖找到有類似問題,但不能它的任何主題。
在此先感謝!
能在awk中做到這一點很容易:
example.sh
#!/bin/bash
awk '
{
if(NR==5){ print $4; }
}
' < "$1"
輸出
$ ./example.sh input.txt
o
細節
- NR濾波器的行號
- $ 4參照第四字段(在C柱)
請使用'... <「$ 1」'或'<「$ 1」...'而不是'cat $ 1 | ...'更有效率(因爲它給'awk'一個文件的直接句柄,而不是通過從文件讀取'cat'進程的管道的句柄),並且也更少錯誤(不引用文件名意味着它受到字符串分裂和匹配的影響)。建議修正 –
以修復多餘的io。在csv的問題上,雖然即將出現的RFC規範似乎包括使用更通用的分隔符([csv-wikipedia](https://en.wikipedia.org/wiki/Comma-separated_values)),但通常csv是逗號分隔的。 – amdixon
的確,我意識到這一點 - Python CSV模塊支持備用分隔符,但是當OP指出它是「Excel文件」時,我做了一個假設(然後是合理的),他們使用了Excel的默認變體CSV格式。 –
棘手的部分是轉換成"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"
CSV文件不是Excel特定的格式。當你說「excel」時,你會讓人們認爲你在談論.xls或.xlsx,這是一個非常不同的問題(對於那些你想要使用Python,它有一些非常好的解析器可用)。這就是說 - 對於bash而言,最簡單的解決方案稍微不準確,如果您的單元格中包含逗號,則無法正常工作。你知道這是否有可能嗎? –
其實我把.csv文件與空格,因爲在我的Excel設置我有選項來顯示這些文件作爲正常的Excel文件。我假設沒有這個設置,所有的值應該用逗號分開。 – nemox007
並且您的實際文件將以這種方式保存,因此它不僅僅用於演示目的?那有效。 (儘管這意味着如果你的任何數據包含空格,我們需要知道它以給出正確的答案)。 –