我正在尝试使用awk修改文本文件。有三列,我想删除第一列中的部分文本:
range=chr1 20802865 20802871
range=chr1 23866528 23866534
到
chr1 20802865 20802871
chr1 23866528 23866534
我该怎么做?
我已尝试awk '{ substr("range=chr*", 7) }'
和awk '{sub(/[^[:space:]]*\\/, "")}1'
,但会删除该文件的所有内容。
答案 0 :(得分:6)
将字段分隔符设置为=
并打印第二个字段:
# With awk
$ awk -F= '{print $2}' file
chr1 20802865 20802871
chr1 23866528 23866534
# Or with cut
$ cut -d= -f2 file
chr1 20802865 20802871
chr1 23866528 23866534
# How about grep
$ grep -Po '(?<==).*' file
chr1 20802865 20802871
chr1 23866528 23866534
# Temp file needed
$ cut -d= -f2 file > tmp; mv tmp file
如果要将更改存储回awk
,cut
,grep
和file
都需要临时文件,更好的解决方案是使用sed
}:
sed -i 's/range=//' file
这将range=
替换为-i
,sed
表示更改已就地完成,因此无需处理临时文件,因为{{1}}会为您执行此操作。
答案 1 :(得分:1)
看起来你在文件中使用制表符而不是空格作为分隔符,所以:
awk 'BEGIN{FS="[=\t]"; OFS="\t"} {print $2, $3, $4}' input_file
或
awk 'BEGIN{FS="[=\t]"; OFS="\t"} {$1=""; gsub("\t\t", "\t"); print}' input_file
答案 2 :(得分:1)
如果您不需要使用awk
,则可以使用sed
,我觉得这有点简单。希望您熟悉正则表达式运算符,例如^
和.
。
$ cat awkens
range=chr1 20802865 20802871
range=chr1 23866528 23866534
$ sed 's/^range=//' awkens
chr1 20802865 20802871
chr1 23866528 23866534