2017-05-12 4 views
1

sei angenommen, eine Textdatei (file1), die mehrere Linien von alphabetischen Zeichenketten enthält, durch eine kurze alphanumerische Zeichenfolge vorangestellt, die jeweils als Strichcode handelt. Die alphabetischen Zeichenfolgen sind alle identisch, die vorhergehenden alphanumerischen Zeichenfolgen nicht. Alphabetische und alphanumerische Zeichenfolgen sind in jeder Zeile durch ein Leerzeichen getrennt.Spaltenbereich von Textdatei über bash Werkzeug Extrahierung

$ cat file1 
a1 abcdefghijklmnopqrstuvwxyz 
b27 abcdefghijklmnopqrstuvwxyz 
c4 abcdefghijklmnopqrstuvwxyz 

Es sei angenommen, eine zweite Datei (file2), die Informationen auf einem Spalte-Bereich enthält. Dieser Bereich ist immer kleiner als die alphabetische Zeichenfolge.

$ cat file2 
2-13 

Ich versuche, bash-Code zu entwickeln, der die Spaltenbereich in file2 von den alphabetischen Zeichenketten in file1 angegeben extrahiert, während die Barcodes zu halten.

$ sought_command file1 file2 
a1 bcdefghijklm 
b27 bcdefghijklm 
c4 bcdefghijklm 

Ich bin unsicher, welche bash Elektrowerkzeug in dieser Hinsicht hilfreich sein würde, aber davon ausgehen, dass awk wird das Werkzeug sein, das dies tun könnte.

Anmerkung: Ich bin, dass Code in Python bewusst am einfachsten sein kann in Bezug auf diese Aufgabe zu schreiben, was ich auch tat. Ich fand jedoch, dass meine Python-Implementierung unangemessen langsam war, da die zu verarbeitenden alphabetischen Zeichenfolgen Zehntausende von Zeichen lang waren. Daher versuche ich bewusst, dieses Problem mit einem Bash-Tool zu lösen.

Antwort

3
$ awk 'NR==FNR{start=$1;lgth=$2;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1 
a1 bcdefghijklmn 
b27 bcdefghijklmn 
c4 bcdefghijklmn 

oder wenn das zweite Feld die Endposition ist eher als die Länge:

$ awk 'NR==FNR{start=$1;lgth=$2-$1+1;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1 
a1 bcdefghijklm 
b27 bcdefghijklm 
c4 bcdefghijklm 
+0

Wow! Für mich ist das Bash Power vom Feinsten. Vielen Dank für Ihre Antwort. –

+1

Gern geschehen und danke, aber diese Antwort hat nichts mit bash zu tun. Es ist awk, ein völlig separates Tool, das von jeder UNIX-Shell (bash, ksh, csh, sh usw.) oder von Windows aufgerufen werden kann. Es ist nur bei allen UNIX-Installationen Standard. Die Verwendung von bash oder anderen Shell-Konstrukten wäre für Ihr Problem nicht geeignet - siehe [https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text- angesehen-bad-Praxis] (https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice) –

+0

ich habe erkannt, dass Ihr Code verhält sich so, als wäre die zweite Anzahl von 'Datei2' die Länge, nicht die Stoppposition des Spaltenbereichs. Um das Problem zu beheben, habe ich versucht, den Befehl in 'awk' zu ändern. NR == FNR {start = $ 1; lgth = $ (ausdr $ 2- $ 1); next} {print $ 1, substr ($ 2, start, lgth)} 'FS =' - 'Datei2 FS =' 'Datei1'. Siehe die interne Subtraktion. Meine Änderung funktioniert jedoch nicht. Hättest du einen Vorschlag für mich? –

Verwandte Themen