2016-05-20 6 views
3

Gibt es in Linux eine Möglichkeit, alle Dateien in einem Verzeichnis zu verketten, die mit .out in einer Datei enden? Es wäre sogar noch besser, wenn die endgültige Ausgabedatei sie horizontal nebeneinander hätte, anstatt vertikal. Außerdem ist es möglich, nur die 6. Spalte von jeder Datei zu erhalten (jede Spalte ist durch ein Leerzeichen getrennt).alle Dateien horizontal und nur eine bestimmte Spalte verketten

Ich weiß, dass ich das in Powershell getan habe. fragte sich, ob Linux das tun kann?

Ich weiß, ich

paste *.out > total.out 

verwenden können, aber wie kann ich fügen Sie einfach die 6. Spalte, die durch Leerzeichen getrennt sind?

+1

Es ist nicht viel mit Linux zu tun. Linux ist nur ein Kernel. Es geht um die installierten Programme, oft das GNU-System. Und ja, du hast awk, sed, bash und viele mehr zu deiner Verfügung und sie können das tun. – totoro

+0

Zeigen Sie zwei Beispieldateien an und wie Ihre endgültige Datei aussehen soll. – totoro

Antwort

0

Speichern Sie dieses Skript als SH-Datei und führen Sie es dann in Ihrem Verzeichnis aus. Diese Methode verwendet sponge, die Sie in Ubuntu mit sudo apt-get install moreutils

saveColumn6.sh

# Make total.out a blank file 
rm total.out 
> total.out 
# Go through every file ending in '.out' 
for i in *.out 
do 
    # cut out field 6, append it to total.out, and rewrite the file. 
    cut -d ' ' -f6 $i | paste -d' ' total.out - | sponge total.out 
done 

Hier sind die Input-Dateien I verwendet installieren kann dies zu testen.

in0.out

1 2 3 4 5 6 
7 8 9 10 11 12 

in1.out

13 14 15 16 17 18 
19 20 21 22 23 24 

in2.out

25 26 27 28 29 30 
31 32 33 34 35 36 

Hier wird die Ausgabedatei I

erhielt

total.out

6 18 30 
12 24 36 

Beachten Sie, dass es in dieser neuen Datenbank einen führenden Platz gibt, ich konnte nicht herausfinden, wie man das loswerden kann.

Wie Nightcrawler erwähnt, ist Linux nicht die relevante Komponente. Sie suchen nach bash, der Kommandozeilen-Shell, die von vielen GNU/Linux-basierten Systemen verwendet wird.

+0

Ich musste Schwamm verwenden, um gleichzeitig zu Total.out zu lesen und zu schreiben. Ich wäre interessiert, wenn jemand einen Weg ohne die Schwammabhängigkeit kennen würde. –

2

Verwenden Sie bash und awk mit temporären Dateien, um die sechste Spalte jeder Datei *.out zu filtern.

#!/bin/bash 

declare -a TEMPS 

for name in *.out; do 
    TEMPS+=($(mktemp $name.XXXXXXXX)) 
    awk '{ print $5 ;}' $name >${TEMPS[-1]} 
done 

paste -d ' ' "${TEMPS[@]}" 

# Remove tmp files 
rm "${TEMPS[@]}" 

Output verwendet, hat die Beispieldateien von @ Daniel

6 18 30 
12 24 36 
+0

Leider gibt mir das nur eine leere Datei. –

+0

Welches Trennzeichen haben Sie in den '* .out' Dateien? – totoro

+0

Sieht so aus: Anzahl der freien Websites: 2104 –