2016-12-13 2 views
2

У меня есть файл со списком идентификаторов следующегоGrep первого вхождения в каждой строке

OG1: apple|fruits_1 cucumber|veg_1 apple|fruits_1 carrot|veg_2 
OG2: apple|fruits_5 cucumber|veg_1 apple|fruits_1 pineapple|fruit_2 
OG3: cucumber|veg_1 apple|fruits_9 carrot|veg_2 
OG4: apple|fruits_3 cucumber|veg_1 apple|fruits_4 pineapple|fruit_7 
OG5: pineapple|fruit_2 pineapple|fruit_2 apple|fruits_1 pineapple|fruit_2 
OG6: apple|fruits_5 apple|fruits_1 apple|fruits_6 apple|fruits_7 

Теперь я хочу, чтобы извлечь первое вхождение яблока | в каждой строке, чтобы дать мне

OG1: apple|fruits_1 
OG2: apple|fruits_5 
OG3: apple|fruits_9 
OG4: apple|fruits_3 
OG5: apple|fruits_1 
OG6: apple|fruits_5 

Я попытался

grep -w -m 1 "apple" sample.txt 

который только дает мне

OG1: apple|fruits_1 cucumber|veg_1 apple|fruits_1 carrot|veg_2 

ответ

3

Если awk хорошо для вас:

Сохранить входные линии в образце .csv.

awk '{for(x=1;x<=NF;x++){if(substr($x,0,6)=="apple|"){print $1, $x; next}}}' sample.csv 
  • использовать цикл для перебора полей каждой строки
  • проверяет подстроку substr($x, 0, 6) равно «яблоко |» или нет. если печать поля по print $1, $x и использовать next для игнорирования отдыха полей текущей строки

Выход:

OG1: apple|fruits_1 
OG2: apple|fruits_5 
OG3: apple|fruits_9 
OG4: apple|fruits_3 
OG5: apple|fruits_1 
OG6: apple|fruits_5 
1

Sed версия

sed 's/\([[:blank:]]apple|[^[:blank:]]*\).*/\1/;s/:.*[[:blank:]]apple/: apple/;/apple/!d' YourFile 

# assuming blank are space 
sed 's/\(apple|[^ ]*\).*/\1/;s/:.* apple/: apple/;/apple/!d' YourFile 
Смежные вопросы