Sto cercando di passare la query grep tramite xargs mentre passo il file attraverso la sostituzione del processo.
command1 | xargs -I{} grep {} <(command2)
creare file fittizi
for f in {1..50}; do echo $f >> test50.txt; done
for f in {25..30}; do echo $f >> test5.txt; done
xarg e sostituzione di processo con grep
cat test5.txt | xargs -I{} grep {} <(cat test50.txt)
l'output è:
25
l'output desiderato è:
25
26
27
28
29
30
Penso che il problema risieda nel modo in cui grep sta ricevendo il file di input, si ferma dopo una riga, mentre mi piacerebbe che cercasse l'intero file di input
risposte:
2 per risposta № 1Con GNU Parallel sembra che questo:
cat test5.txt | parallel "grep {} <(cat test50.txt)"
1 per risposta № 2
Considera questo
cat test5.txt | xargs -I{} cat {} <(cat test50.txt)
uscite
cat: 25: No such file or directory
1
2
--cutted for brevity--
49
50
cat: 26: No such file or directory
cat: 27: No such file or directory
cat: 28: No such file or directory
cat: 29: No such file or directory
cat: 30: No such file or directory
Non si tratta di grep
, ma process substitution
. Crea una named pipe e tutti i dati da quella pipe vengono consumati per primi grep
(o cat
come nell'esempio sopra) invocazione.
Questo funzionerà
cat test5.txt | xargs -I{} bash -c " grep {} <(cat test50.txt)"
poiché crea in modo indipendente la sostituzione del processo per ogni esecuzione di grep.
0 per risposta № 3
non c'è bisogno di xargs
come grep
ha già un modo per specificare i termini di ricerca da un file
$ seq 50 > f1
$ seq 25 30 > f2
$ grep -Fxf f2 f1
25
26
27
28
29
30
A partire dal man grep
-F, --file fisse Interpretare PATTERN come una lista di stringhe fisse (invece di espressioni regolari), separate da newline, ognuno dei quali deve essere abbinato.
-x, --line-regexp Seleziona solo le partite che corrispondono esattamente all'intera linea. Per un modello di espressione regolare, questo è come parentesi il modello e poi lo circondano con ^ e $.
-f FILE, --file = FILE Ottieni pattern da FILE, uno per riga. Se questa opzione è utilizzata più volte o è combinata con l'opzione -e (--regexp), cerca tutti i modelli dati. Il file vuoto contiene zero pattern e quindi non corrisponde a nulla.