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

标签 linux perl unix sed 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

最佳答案

不太清楚期望的输出应该是什么,但这是我的解释,使用 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

使用庆典:

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   .

关于linux - 如何使用 awk 修改文本字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6304933/

相关文章:

用于从文件中替换换行符的 ruby​​ 等效 perl 命令?

linux - sed 从字符串中删除一个单词?

python - 检查python中ftp文件传输的状态

perl - 这段 perl 代码有什么作用?

c++ - 人们会推荐哪些工具来查看 gcc/linux 目标文件?

regex - 在 Perl 正则表达式中匹配捕获组的反向翻译

c - 如何使用 mmap 文件映射变量

c - 如何获取服务器程序的 IP 地址?

linux - Bash 脚本阻止所有 Apple 设备

c - 使用内存映射逐 block 打开和读取大文件 (100GB)