grep
sám je toho schopen. Jednoduše použijte příznak -f
:
grep -f <patterns> <file>
<patterns>
je soubor obsahující jeden vzor v každém řádku; a <file>
je soubor, ve kterém chcete hledat věci.
Všimněte si, že pro vynucení grep
abyste každý řádek považovali za vzor, i když obsah každého řádku vypadá jako regulární výraz, měli byste použít příznak -F, --fixed-strings
.
grep -F -f <patterns> <file>
Pokud je váš soubor CSV, jak jste řekli, můžete:
grep -f <(tr ',' '\n' < data.csv) <file>
Jako příklad zvažte soubor "a.txt" s následujícími řádky:
alpha
0891234
beta
Nyní soubor "b.txt" s řádky:
Alpha
0808080
0891234
bEtA
Výstup následujícího příkazu je:
grep -f "a.txt" "b.txt"
0891234
Vůbec nepotřebujete for
-smyčka zde; grep
sám tuto funkci nabízí.
Nyní pomocí názvů souborů:
#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"
Můžete změnit ','
na oddělovač, který máte ve svém souboru.
Jiné řešení:
- použijte
awk
a vytvořte si vlastníhash
(např. ahash), vše ovládáte sami. - nahraďte
$0 to $i
a můžete přiřadit jakákoli pole, která chcete.
awk -F"," '
{
if (nowfile==""){ nowfile = FILENAME; }
if(FILENAME == nowfile)
{
hash[$0]=$0;
}
else
{
if($0 ~ hash[$0])
{
print $0
}
}
} ' xx yy
Jak provést smyčku pro každého přes všechny soubory pod zadanou cestou?
O_RDWR na pojmenovaných kanálech s poll()