我正在尝试使用awk删除文本文件中的前三个字段。删除前三个字段很容易。但awk会破坏行的其余部分:分隔符从制表符更改为空格。
以下是我的尝试:
head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }'
前三列已经被正确删除了。问题是输出结果中第四列、第五列和第六列之间的制表符被转换成了空格。
更新:这个问题被标记为重复的另一个问题创建时间晚于此问题,请查看日期。
我正在尝试使用awk删除文本文件中的前三个字段。删除前三个字段很容易。但awk会破坏行的其余部分:分隔符从制表符更改为空格。
以下是我的尝试:
head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }'
前三列已经被正确删除了。问题是输出结果中第四列、第五列和第六列之间的制表符被转换成了空格。
更新:这个问题被标记为重复的另一个问题创建时间晚于此问题,请查看日期。
首先,正如ED所评论的那样,您需要在awk中使用FS
作为字段分隔符。
由于您没有定义OFS
,所以tab
在输出中变成了space
。
awk 'BEGIN{FS=OFS="\t"}{$1=$2=$3="";print}' file
<tab>
也会被保留。awk 'BEGIN{FS=OFS="\t"}{print $4,$5,$6}' file
将无需前导空格/制表符输出。但是如果您有500个列,您必须在循环中执行此操作,或使用sub
函数或考虑其他工具(例如cut)。
cut -f4- inFile
如果您不想改变字段分隔符,请使用sed
删除前三列:
sed -r 's/(\S+\s+){3}//' file
-i
选项:sed -ri 's/(\S+\s+){3}//' file
\S
和\s
都是PCRE的特性。不能保证sed
支持它们;POSIX标准仅保证BRE具有非常少量的扩展--请参见https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html#tag_20_116_13_02 - Charles Duffy\s
的可移植方式是[[:space:]]
,编写\S
的可移植方式是[^[:space:]]
。 - Charles Duffyawk '{for (i=4; i<NF; i++) printf $i " "; print $NF}'
awk '{for (i=4; i<=NF; i++) printf $i " "; printf "\n"}'
或添加一些额外的逻辑来防止尾随空格。 - Wildcard