我有一個 3-4M 行的 csv 檔案(my_csv.csv),其中有兩列:
col1,col2
val11,val12
val21,val22
val31,val32
...
csv 僅包含兩列,每行一個逗號。Col1 和 Col2 值只是字串(沒有別的)。上面顯示的結果是命令的結果head my_csv.cs..
我想檢查一個字串test_str是否在 col2 值中。我的意思是,如果test_str = val12 我希望測驗回傳True,因為val12它位于第 2 列(如示例所示)。但如果test_str = val1244 我想讓代碼回傳False.
在 python 中,它會是:
import pandas as pd
df = pd.read_csv('my_csv.csv')
test_str = 'val42'
if test_str in df['col2'].to_list():
# Expected to return true
# Do the job
但我不知道如何在 bash 中做到這一點。
(我知道這df['col2'].to_list()不是一個好主意,但我不想使用內置的 pandas 函式來使代碼更容易理解)
uj5u.com熱心網友回復:
awk在 bash 實用程式中最適合處理csv資料:
awk -F, -v val='val22' '$2 == val {print "found a match:", $0}' file
found a match: val21,val22
一個等效的bash回圈是這樣的:
while IFS=',' read -ra arr; do
if [[ ${arr[1]} == 'val22' ]]; then
echo "found a match: ${arr[@]}"
fi
done < file
但請記住,與 cat 相比,Bash while read 回圈非常慢,為什么?
uj5u.com熱心網友回復:
決議 CSV 很困難......除非你的欄位不包含逗號、換行符......而且你沒有在 bash 中做你想做的事情,在一個大檔案上它會非常慢。您可以使用類似awk或的實用程式來執行此操作,這些實用程式grep也可與dash,zsh或其他 shell 一起使用。因此,如果您有一個非常簡單的 CSV 格式,您可以使用,例如grep:
if grep -q ',val42$' my_csv.csv; then
<do that>
fi
我們也可以將要搜索的字串放在變數中,但請記住,某些字符在正則運算式中具有特殊含義,應該被轉義。例如,如果要搜索的字串中沒有特殊字符:
test_str="val42"
if grep -q ",$test_str$" my_csv.csv; then
<do that>
fi
uj5u.com熱心網友回復:
3-4Mrows 是一個小檔案到awk. 還不如就做
{m,g}awk 'END { exit !index($_,","(__)"\n") }' RS='^$' FS='^$' __="${test_str}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496500.html
標籤:重击
