2015-07-10 4 views
2

Для каждой строки в моем файле я хочу напечатать все на этой строке до 4-го тире.Как разбить строку на n-ом разделителе?

Вход:

TCGA-HC-8216-10A-11D-A323-01 
TCGA-J4-8200-10A-11D-A323-01 
TCGA-EJ-A65E-10A-11D-A323-01 

, и я хочу, чтобы разделить каждую строку на четвертом тире "-"

Выход:

TCGA-HC-8216-10A 
TCGA-J4-8200-10A 
TCGA-EJ-A65E-10A 

Я знаю, что могу разделить на каждом тире, как это :

#!/usr/bin/env bash 

IN="TCGA-HC-8216-01A-11D-A323-01 
TCGA-J4-8200-10A-11D-A323-01 
TCGA-EJ-A65E-10A-11D-A323-01" 

arr=$(echo $IN | tr "-" "\n") 

for x in $arr 
do 
echo "> [$x]" 
done 

, но это разбивает и печатает каждую часть строки между каждой тире.

+0

Посмотрите на команды 'cut' и/или' awk'. –

ответ

4

Использование cut

cut -d- -f1-4 <<'EOF' 
TCGA-HC-8216-01A-11D-A323-01 
TCGA-J4-8200-10A-11D-A323-01 
TCGA-EJ-A65E-10A-11D-A323-01 
EOF 

Вы сокращаете свой вход на -d (разделитель) из - и возвращения -f (поля) 1-4, один через четыре.

1
#!/bin/bash 

IN="TCGA-HC-8216-01A-11D-A323-01 
TCGA-J4-8200-10A-11D-A323-01 
TCGA-EJ-A65E-10A-11D-A323-01" 

arr=$(echo "$IN" | cut -d '-' -f1-4) 

echo "$arr" 

Печать:

TCGA-HC-8216-01A 
TCGA-J4-8200-10A 
TCGA-EJ-A65E-10A 
0

Использование Grep с ЭРД:

arr=$(echo "$IN" | grep -oE "^([^-]*-){3}[^-]*") 

С BRE:

arr=$(echo "$IN" | grep -o "^\([^-]*-\)\{3\}[^-]*") 

Пример:

#!/bin/bash 
IN="TCGA-HC-8216-01A-11D-A323-01 
TCGA-J4-8200-10A-11D-A323-01 
TCGA-EJ-A65E-10A-11D-A323-01" 

arr=$(echo "$IN" | grep -oE "^([^-]*-){3}[^-]*") 

for x in $arr 
do 
echo "> [$x]" 
done 

Выход:

> [TCGA-HC-8216-01A] 
> [TCGA-J4-8200-10A] 
> [TCGA-EJ-A65E-10A] 
0

Использование чистого Баш и сопоставления с образцом:

#!/bin/bash  
IN="TCGA-HC-8216-01A-11D-A323-01 
TCGA-J4-8200-10A-11D-A323-01 
TCGA-EJ-A65E-10A-11D-A323-01" 

re='([^-]+-){3}[^-]+' 

for line in $IN 
do 

    if [[ $line =~ $re ]]; then 
     trunc=${BASH_REMATCH[0]} 
    fi 
    echo "$trunc" 
done 

Выход:

TCGA-HC-8216-01A 
TCGA-J4-8200-10A 
TCGA-EJ-A65E-10A