nur mehrfach vorkommende ausdrucke ausgeben

L

L0rd

Mitglied
Hallo,

habe eine datei "test" das aus 2 Spalten besteht getrennt mit ">". Wie gebe ich nur die Zeilen aus bei dennen die erste Spalte (also alles was bis ">" steht) mehrmals vorkommt ?



Code:
echo "0-;0-;2-16_35;>;4,455;38;
0-;0-;2-26_35;>;1,070;18;
0-;0-;2-26_35;>;3,221;30;
0-;0-;2-26_35;>;5,156;32;
0-;0-;2-32_35;>;1,284;42;
0-;0-;2-32_35;>;1,328;40;
0-;0-;2-32_35;>;1,881;38;
0-;0-;2-32_35;>;2,826;36;
0-;0-;2-32_35;>;3,171;34;
0-;0-;2-32_35;>;6,693;32;
0-;0-;2-32_35;>;,794;44;
0-;0-;3-1_17_35;>;2,537;32;
0-;0-;3-1_3_37;>;,721;42;
0-;0-;4-14_25_27_29;>;2,859;28;
0-;0-;6-1_3_5_7_17_35;>;4,089;34;
0-;1-10;1-13;>;29,893;30;
0-;1-10;1-14;>;,908;14;
0-;1-10;1-17;>;6,989;18;
0-;1-1;1-1;>;,790;12;
0-;1-1;1-26;>;1,942;38;
0-;1-1;2-1_28;>;2,726;16;" > test;

habe schon mal mit verschiedenen Schalter von uniq probiert

Code:
tr '\t' '>' <  test | uniq -f 1 -D

leider klappt es nicht :(

Danke
 
Meinste sowas:

Code:
while read LINE; do
 if [ "`echo $LINE | cut -d ">" -f 1`" ==  "`echo $LINE | cut -d ">" -f 2`" ]; then
  echo $LINE
 fi
done < test

EDIT: Problem missverstanden :(

So sollte es gehen:
Code:
#! /bin/bash

FILE=$1

while read FIRST_LINE; do
	FIRST_COLUMN_FIRST_LINE="`echo $FIRST_LINE | cut -d ">" -f 1`"
	MATCHES=0

	while read SECOND_LINE; do
		FIRST_COLUMN_SECOND_LINE="`echo $SECOND_LINE | cut -d ">" -f 1`"
		if [ "$FIRST_COLUMN_FIRST_LINE" == "$FIRST_COLUMN_SECOND_LINE" ]; then
			MATCHES=$(($MATCHES+1))
		fi
	done < $FILE

	if [ $MATCHES -gt 1 ]; then
		echo $FIRST_LINE
	fi
done < $FILE

Läuft in O(n²) - ohne Beweis :D
 
Zuletzt bearbeitet von einem Moderator:
Code:
awk -F\> '{print $1}' test |uniq -c |awk '{sub(/^[ \t]+/, "")};1'| grep -v ^1 |awk '{print $2}' |while read line; do grep ^$line test;done

so gehts auch
 
da kann ich Schard nur Recht geben

danke ! es funktioniert

kann man da vielleicht auch Mindestanzahl von gleichen Ausdrucken vorgeben ? z.B. ab 5
 
Bei meinem Skript ginge das, indem du
Code:
if [ $MATCHES -gt 1 ]; then
		echo $FIRST_LINE
	fi
durch
Code:
if [ $MATCHES -gt 5 ]; then
		echo $FIRST_LINE
	fi

ersetzt

Mit awk kenne ich mich, wie zuvor gesagt, leider nicht aus. :))
 
Zuletzt bearbeitet von einem Moderator:
Code:
[B]anzahl=5;[/B]awk -F\> '{print $1}' test |uniq -c | awk '$1 >= "'"$anzahl"'" {print $2}' |while read line; do grep ^$line test;done
 

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Creative Labs SoundBlaster Audigy 2 ZS unter Debian / Kernel 3.16

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Fedora 20 - Unlösbare Paket-Duplikat Konflikte

Rollei Mini Wifi Camcorder

Zurück
Oben