J'ai un fichier texte, chaque ligne est stockée comme ceci:
"Video or movie" "parent" "Media or entertainment" "1" "1" "1" "0" "0"
Je veux échanger les colonnes 3 avec 2, à savoir
"Video or movie" "Media or entertainment" "parent" "1" "1" "1" "0" "0"
Comment le faire sous Linux dans un script shell ou tout autre langage de script? J'ai juste besoin d'un moyen le plus simple et le plus rapide de le faire.
text-processing
csv
utilisateur11498
la source
la source
Réponses:
Cela peut être fait en
awk
utilisant"
comme séparateur de champs. Mais, pour ce faire, vous devez vous rappeler que la chaîne$1
est vide, qu'elle$2
contient la première chaîne, qu'il$3
y a un espace entre les chaînes, qu'elle$4
est la deuxième chaîne, etc. assez de$n
s. Compte tenu de ces éléments, les éléments suivants devraient fonctionner:la source
awk
.Voici un rapide et sale
sed
qui le fait:Mais échouera pour les champs avec des guillemets doubles dans leurs valeurs, etc.
Un exemple:
Mais je suis sûr que quelqu'un sera capable de vous montrer une
awk
ligne plus simple et meilleure.la source
[ \t]*
.echo '"bored of the main" "melody" "main plot" "1"' | sed -e 's/^\("[^"]*"\) *\("[^"]*"\) *\("[^"]*"\)/\1 \3 \2/'
, et est sorti"bored of the main" "main plot" "melody" "1"
- copié et collé, pas de fautes de frappe dans non plus. GNU sed version 4.2.1J'irais avec:
Les deux
sed
scripts gèrent les guillemets avant et arrière (car ils ne sont pas des délimiteurs et interfèrent). LaBEGIN
clause gère la séparation des champs. Let=$3;$3=$2;$2=t
est un idiome standard de champs d'échange, puis le champ entier est imprimé (avec OFS comme séparateur de champs).la source
"Video or movie" "parent" "Media or entertainment" "1" "1" "1" "0" "0"
) et en copiant ce qui précède (sans utiliser mes incarnations précédentes), je reçois"Video or movie" "Media or entertainment" "parent" "1" "1" "1" "0" "0"
.Cette méthode est en réalité identique à celle de Kevin
awk
. Je l'ai incluse ici simplement à titre de comparaison entre bash et awk .la source
Qu'en est-il quelque chose comme ceci:
la source
-F' ' do? The problem is that this will print (e.g. in the first case)
"film vidéo" ou "parent" ... `, clairement pas ce que veut Frank.J'ai deux solutions.
RÉPONSE UNE: Utilisez
sed
3 fois pour faire ce qui suit:Voici la commande résultante utilisant
sed
(Utilisation de XXX et YYY comme aide pour trouver et supprimer les premier et quatrième paramètres):RÉPONSE DEUX: Convertissez les données en script et exécutez-le!
Implémentez flipcol.sh en tant que:
Ensuite, exécutez la commande suivante sur votre data.txt créant un script shell:
Puis exécutez le script shell nouvellement créé
la source
Hypothèses sur les lignes du fichier: elles commencent par un guillemet double et le champ et les délimiteurs ne contiennent pas de guillemets. Ensuite, cette expression sed fonctionnera:
Si cette expression est suivie du nom du fichier texte, elle donnera la sortie souhaitée, qui peut être insérée dans un nouveau fichier en suivant le nom du fichier texte par le redirecteur de sortie
>
et le nom du nouveau fichier souhaité, comme suit :la source