Shell 删除第一列,然后在awk中保持其余行不变

Shell 删除第一列,然后在awk中保持其余行不变,shell,unix,awk,Shell,Unix,Awk,我正在尝试使用awk删除文本文件中的前三个字段。删除前三个字段很容易。但是行的其余部分被awk弄乱了:分隔符从制表符改为空格 以下是我尝试过的: head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }' 前三列已正确移除。问题是输出结果是$4$5$6等列之间的制表符转换为空格 更新:标记为重复的另一个问题创建的时间晚于此问题:查看日期。如果不希望更改字段分隔,请使用sed删除前3列: sed -r 's/(\S+

我正在尝试使用awk删除文本文件中的前三个字段。删除前三个字段很容易。但是行的其余部分被awk弄乱了:分隔符从制表符改为空格

以下是我尝试过的:

head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }' 
前三列已正确移除。问题是输出结果是$4$5$6等列之间的制表符转换为空格


更新:标记为重复的另一个问题创建的时间晚于此问题:查看日期。

如果不希望更改字段分隔,请使用
sed
删除前3列:

sed -r 's/(\S+\s+){3}//' file
要将更改存储回文件,可以使用
-i
选项:

sed -ri 's/(\S+\s+){3}//' file

首先,正如ED所评论的,您必须在awk中使用
FS
作为字段分隔符。
选项卡
在输出中变为
空格
,因为您没有定义OFS

awk 'BEGIN{FS=OFS="\t"}{$1=$2=$3="";print}' file
这将删除前3个字段,并保留其余文本“未触及”(您将看到前面的3个选项卡)。在输出中,也将保留

awk 'BEGIN{FS=OFS="\t"}{print $4,$5,$6}' file

将在不带前导空格/制表符的情况下输出。但是如果你有500列,你必须在一个循环中完成,或者使用<代码>子<代码>函数,或者考虑其他工具,例如,剪切。

实际上,这可以在这样一个非常简单的剪切命令中完成:

cut -f4- inFile

awk'{for(i=4;在awk中没有名为“IFS”的变量。shell有IFS,awk有FS。可能与@CiroSantilli重复新疆改造中心六四事件法轮功 这一个比我的问题来得晚:看看日期。这一个已经有了很多答案,而且在这一个被创建之前就已经被接受了。嗨,目前的共识是以“质量”来结束:因为“质量”是无法衡量的,所以我只需要向上投票很可能是哪个问题在标题上的谷歌关键词中打得最好。设身处地想想。我得到了一个封闭的答案——当我早些时候问这个问题的时候。创建了一个有点重复的问题的人保留了这个问题。你会怎么想?如果最后一列的名称中包含两个空格,这个问题就失败了。这个失败了如果任何行上的字段少于四个,则生成预期输出。(它将打印最后一个字段,而不是全部删除。)相反,您可以使用:
awk'{for(i=4;我希望它没有被缓冲。
\S
\S
都是PCRE ISM。
sed
不保证支持它们;POSIX标准只保证BRE具有非常少量的保证扩展——请参见……编写
\S
的可移植方式是
[:space:]
,而编写
\S
的便携方式是
[^[:space:]
awk '{for (i=4; i<NF; i++) printf $i " "; print $NF}'