ubuntuusers.de

follow up: Zeichen in Textdateien löschen

Status: Gelöst | Ubuntu-Version: Lubuntu 18.04 (Bionic Beaver)
Antworten |

DonMM

Anmeldungsdatum:
30. Juli 2017

Beiträge: 249

Nach erfolgreicher Lösung meines Beitrages //forum.ubuntuusers.de/post/9087840/: steht in den Textdateien in jeder Zeile 2 (durch Doppelpunkt getrennte Werte)
A:a
B:b
C:c
besteht dazu die möglichkeit dies spaltenweise auszugeben (transponieren) ?

A B C usw
a b c usw

um es in dieser form in Libre Office Calc zu verwenden.
wäre mir wieder eine grosse Bereicherung

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Also düster erinnere ich mich, vor Jahren mal nach so einem Spalten/Zeilentauscher gesucht zu haben in den coreutils.

Ob ich was gefunden habe, ob ich selbst was gebastelt habe, ich weiß es nicht mehr.

Mein erster Quick-n-Dirty-Versuch, Testdatei anlegen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
echo "A:a
B:b
C:c
D:d
E:e" > columns.txt

cat columns.txt 
A:a
B:b
C:c
D:d
E:e

Und dann laaaaaaaaaaaaaanger Einzeiler:

1
2
3
(grep -o ".*:" columns.txt | pr --columns=5 - | head -n 6 | tail -n1; grep -o ":.*" columns.txt | pr --columns=5 - | head -n 6 | tail -n1 ) | sed 's/://g'
A	      B	    C		  D		E
a	      b	    c		  d		e

Ich kann mich nicht erinnern je pr benutzt zu haben, wahrscheinlich ist meine Verwendung vollkommener Quatsch. ☺

Vielleicht sind column und colrm doch nützlichere Werkzeuge.

Aus der Manpage column:

NAME
     column — columnate lists

SYNOPSIS
     column [-entx] [-c columns] [-s sep] [file ...]

DESCRIPTION
     The column utility formats its input into multiple columns.  Rows are filled before columns.  Input is taken from file operands, or, by default, from
     the standard input.  Empty lines are ignored unless the -e option is used.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

P.S.: Hat LibreOffice nicht einen Menübefehl, um einen Spalten/Zeilentausch vorzunehmen?

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Wenn es dir nichts ausmacht, das Paket rs aus Universe zu installieren, kannst du Tabellen so transponieren:

$ printf 'A:a\nB:b\nC:c\n' | rs -Tc:
A  B  C
a  b  c 

Für alles weitere verweise ich auf die manpage des Tools.

Edit:

  1. Befehl um Ausgabe erweitert

  2. Hinweis: Man kann sowohl die Eingabe als auch die Ausgabe noch anders formatieren (wie gesagt: siehe manpage)

DonMM

(Themenstarter)

Anmeldungsdatum:
30. Juli 2017

Beiträge: 249

ich glaube der quick-n-dirty versuch geht in die richtige richtung

(grep -o ".*:" 11B_try.txt | pr --columns=5 - | head -n 6 | tail -n1; grep -o ":.*" 11B_try.txt | pr --columns=5 - | head -n 6 | tail -n1 ) | sed 's/://g'

liefert

data	      compressor   @mixtype	  @mix		@tweakgroup
{ 			 {	   		 0		  0160164		f3

die dateien haben jew. 109 Zeilen. Obige Spalten sind Zeile 1,Zeile 24, Zeile 42, Zeile 62, Zeile 82
und:
ja, in Libre Office kann man zeilen und spalten transponieren. Ich dachte nur es geht ev. mit dem löschen der versch. zeichen der textdatei "in einem rutsch" ☺
Für mich ist es ok, wenn ich es in Libre Office mache. Ich setze das Thema einmal prophylaktisch als gelöst.Beruhigend, irgendwie auch, dass eine lösung nicht so einfach scheint, d.h. ich sie nicht selbst finden konnte. Danke dir auf jedn Fall für deine zeit / mühe / anteilnahme.

DonMM

(Themenstarter)

Anmeldungsdatum:
30. Juli 2017

Beiträge: 249

danke auch Cranvil da habe ich wohl nun 10 Minuten vor meiner Antwort nicht refresht ☺

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

user_unknown schrieb:

P.S.: Hat LibreOffice nicht einen Menübefehl, um einen Spalten/Zeilentausch vorzunehmen?

Ja: https://help.libreoffice.org/Calc/Rotating_Tables_Transposing/de

Ansonsten könnte man auch rs nutzen:

rs -c: -C, -T < data.txt > transposed.csv 

Edit: da war ich zu langsam...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Bevor ich jetzt vom mir bislang unbekannten rs gelesen habe, hatte ich noch einen anderen Scriptversuch unternommen:

1
sed 's/:/\t/g' columns.txt | ( declare -a lig; declare -a lik; cnt=0; while read gr kl ; do lig[cnt]=$gr; lik[cnt]=$kl; ((cnt+=1)); done; echo ${lig[@]} ; echo ${lik[@]};)

oder übersichtlicher, das ganze:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sed 's/:/\t/g' columns.txt | ( 
	# lig, lik => Liste groß/klein
	declare -a lig
	declare -a lik
	cnt=0 
	while read gr kl 
	do 
		lig[cnt]=$gr
		lik[cnt]=$kl
		((cnt+=1)) 
	done 
	echo ${lig[@]} 
	echo ${lik[@]}
)

Also erst die Werte in 2 Arrays einlesen und am Ende beide ausgeben.

Für das Zufügen von Elementen zu Arrays gibt es, meine ich, noch eine einfachere Syntax, und für das Bulk-Hinzufügen auch, aber die nutze ich zu selten, um sie auswendig zu kennen, und sie sind auch nicht ganz leicht zu suchen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13206

Für "zu Fuß" würde ich awk nehmen:

1
2
3
4
5
6
7
8
9
$ cat columns.txt 
A:a
B:b
C:c
D:d
E:e
$ awk -F : 'NR == 1 {for (i=1;i<=NF;++i) a[i]=$i} NR > 1 {for (i=1;i<=NF;++i) a[i] = a[i] FS $i} END {for (i in a) print a[i]}' columns.txt 
A:B:C:D:E
a:b:c:d:e
Antworten |