1
votes

Utilisation de bash pour parcourir des fichiers de même nom et grep

J'ai une liste de fichiers de base:

grep -wf "file1.txt" "target1.txt" > "result1.txt" 
grep -wf "file2.txt" "target2.txt" > "result2.txt" 

et une liste de fichiers cibles:

target1.txt
target2.txt 
target3.txt

et je souhaite utiliser bash pour exécuter la commande suivante en utilisant une boucle:

file1.txt 
file2.txt 
file3.txt 

Les fichiers auront tous le même nom en plus de l'entier final, qui sera dans une série (1:22).


4 Réponses :


2
votes

Avec une boucle for:

for((i=1; i<=22; i++)); do
  grep -wf "file$i.txt" "target$i.txt" > "result$i.txt" 
done


0 commentaires

1
votes

Il s'agit d'une version sur une ligne adaptée à la ligne de commande avec extension d'accolades:

for i in {1..22};do grep -wf "file$i.txt" "target$i.txt" > "result$i.txt"; done


0 commentaires

2
votes

Avec un nombre arbitraire de fichier # .txt et target#.txt:

#!/usr/bin/env bash

shopt -s extglob # Enable extended globbing patterns

# Iterate all file#.txt
for f in file+([[:digit:]]).txt; do
  # Extract the index from the file name by stripping-out all non digit characters
  i="${f//[^[:digit:]]//}"

  file="$f"
  target="target$i.txt"
  result="result$i.txt"

  # If both file#.txt and target#.txt exists
  if [ -e "$file" ] && [ -e "$target" ]; then
    grep -wf "$file" "$target" >"$result"
  fi
done


0 commentaires

1
votes

Faites-les tous en parallèle avec GNU Parallel :

 parallel 'grep -wf file{}.txt target{}.txt > result{}.txt' ::: {1..22}


0 commentaires