簡體   English   中英

如何使用 awk 修改文本字段?

[英]How do I modify a text field with awk?

我想刪除第一個冒號: (包括)之后的文本,或者將其替換為空。

例如, 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

有點不清楚所需的 output 應該是什么,但這是我的解釋,使用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 -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  .

第三次,希望是最后一次更新

使用 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   .
perl -p -e 's/:\d+:\d+//g' mydatafile

嘗試這個:

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

Output

1       313     .       T       C       30.11        1  .       .       .
1       316     .       A       T       30.80        1  .       0  .
1       317     .       T       A       31.40        1  .       0  .

這是使用sed最短的一個:

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

這會將 orig 文件的副本保留為inputfile.orig 並就地替換文件。

這應該可以解決問題。

$ 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替換每次出現的x:y:z 在這種情況下,我會使用這個 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       .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM