[英]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.