Как изменить текстовое поле с помощью awk? - PullRequest
2 голосов
/ 10 июня 2011

Я хочу удалить текст после первого двоеточия : (включительно) или заменить его ничем.

Например, 1:5:30 следует заменить на 1. Я предпочитаю сценарий awk для выполнения этой работы. Но я не знаю, как это сделать. Не могли бы вы дать мне какие-либо указания? Заранее спасибо.

Мои данные разделены табуляцией, и файл выглядит так, как будто в некоторых ячейках есть точки.

1       313     .       T       C       30.11        1:5:30  .       .       .
1       316     .       A       T       30.80        1:5:30  .       0:8:28  .
1       317     .       T       A       31.40        1:5:36  .       0:8:28  .

Я попробовал следующее, но у меня не получилось со всеми из них:

sed 's/:*:*//g' mydatafile
sed 's/:[0-9]:[0-9]//g' mydatafile

Ответы [ 5 ]

4 голосов
/ 10 июня 2011

Немного неясно, каким должен быть желаемый вывод, но это моя интерпретация: sed:

$ sed 's/:.*//' input
1   313 .   T   C   30.11   1
1   316 .   A   T   30.80   1
1   317 .   T   A   31.40   1

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

$ awk -F":" '{print $1}' input
1   313 .   T   C   30.11   1
1   316 .   A   T   30.80   1
1   317 .   T   A   31.40   1

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

cut -d":" -f1 input

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

IFS=':'

while read a b; do
    echo $a
done < input

Альтернативная интерпретация с использованием awk:

$ awk 'BEGIN {OFS="\t"} {sub(/:.*/,"",$7); print}' input
1   313 .   T   C   30.11   1   .   .   .
1   316 .   A   T   30.80   1   .   0:8:28  .
1   317 .   T   A   31.40   1   .   0:8:28  .

3-е и, возможно, последнее обновление

3-еинтерпретация с использованием awk:

$ awk 'BEGIN {OFS="\t"} {for (i=1;i<NF;i++){sub(/:.*/,"",$i)}; print}' input
1   313 .   T   C   30.11   1   .   .   .
1   316 .   A   T   30.80   1   .   0   .
1   317 .   T   A   31.40   1   .   0   .
3 голосов
/ 10 июня 2011
perl -p -e 's/:\d+:\d+//g' mydatafile
2 голосов
/ 11 июня 2011

Вот самый короткий из них, использующий sed:

sed -i.orig 's/\([0-9]\)*:[^ ]*/\1/g' inputfile

При этом сохраняется копия файла orig как inputfile.orig.И заменяет файл на месте.

2 голосов
/ 10 июня 2011

Попробуйте это:

sed 's/\([0-9][0-9]*\):[0-9][0-9]*:[0-9][0-9]*/\1/g' infile

или

sed 's/\([0-9]\{1,\}\):[0-9]\{1,\}:[0-9]\{1,\}/\1/g' infile

выход

1       313     .       T       C       30.11        1  .       .       .
1       316     .       A       T       30.80        1  .       0  .
1       317     .       T       A       31.40        1  .       0  .
1 голос
/ 10 июня 2011

Это должно сработать.

$ sed -e 's/:.*//' mydatafile
1       313     .       T       C       30.11        1
1       316     .       A       T       30.80        1
1       317     .       T       A       31.40        1

Я думаю, что sed немного проще, чем awk для этой проблемы.

Обзор синтаксиса регулярных выражений

Позже.,.

Из ваших комментариев я вижу, что вы хотите заменить каждое вхождение x:y:z на x.В этом случае я бы использовал эту программу awk.

$ cat test.awk
BEGIN {
  FS = "\t";
}
{
  for (i = 1; i <= NF; i++) {
    if (match($i, /:.*/)) {
        $i = substr($i, 1, RSTART - 1);
    }
    printf("%s\t", $i);
  }
  printf("\n");
}

$ awk -f test.awk test.dat
1       313     .       T       C       30.11   1       .       .       .
1       316     .       A       T       30.80   1       .       0       .
1       317     .       T       A       31.40   1       .       0       .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...