Linux 使用awk或sed打印从第n列到最后一列的所有列

Linux 使用awk或sed打印从第n列到最后一列的所有列,linux,unix,awk,sed,gawk,Linux,Unix,Awk,Sed,Gawk,这不是一个复制品。 stackoverflow上发布的所有以前的问题/解决方案都有相同的问题:额外的空间被替换为单个空间 示例(1.txt) 结果: awk '{$1="";$0=$0;$1=$1}1' 1.txt One space Two spaces Three spaces awk '{$1=""; print substr($0,2)}' 1.txt One space Two spaces Three spaces 使用cut: cut -d' ' -f2- a.txt 打印从

这不是一个复制品。 stackoverflow上发布的所有以前的问题/解决方案都有相同的问题:额外的空间被替换为单个空间

示例(1.txt)

结果:

awk '{$1="";$0=$0;$1=$1}1' 1.txt
One space
Two spaces
Three spaces

awk '{$1=""; print substr($0,2)}' 1.txt
One space
Two spaces
Three spaces
使用
cut

cut -d' ' -f2- a.txt

打印从第二列到最后一列的所有列,并保留空格。

如果将字段定义为任意数量的非空格字符,后跟任意数量的空格字符,则可以删除第一个
N
,如下所示:

$ sed -E 's/([^[:space:]]+[[:space:]]*){1}//' file
Nospaces
One space
Two  spaces
Three   spaces
{1}
更改为
{N}
,其中
N
是要删除的字段数。如果只想从开始处删除1个字段,则可以完全删除
{1}
(以及用于创建组的括号):

某些版本的sed(例如GNU sed)允许您使用速记:

sed -E 's/(\S+\s*){1}//' file
如果行的开头可能有一些空白,您可以在组外的模式开头添加一个
\s*
(或
[[:space:][]*
):

sed -E 's/\s*(\S+\s*){1}//' file

使用awk的问题是,每当您触摸给定记录上的任何字段时,整个记录都会重新格式化,导致每个字段都被
of s
(输出字段分隔符)分隔,默认情况下,该分隔符是一个空格。如果需要,可以将awk与
sub
一起使用,但由于这是一个简单的替代,因此sed是该作业的正确工具。

使用
-F
选项指定
IFS
,以避免
awk
忽略多个空格

awk -F "[ ]" '{$1="";$0=$0;$1=$1}1' 1.txt
awk -F "[ ]" '{$1=""; print substr($0,2)}' 1.txt

要在awk中保留空白,必须使用正则表达式替换或使用替换字符串。一旦开始修改单个字段,awk就必须使用定义的(或隐式的)OFS重新计算$0

参考Tom的sed答案:

awk '{sub(/^([^[:blank:]]+[[:blank:]]+){1}/, "", $0); print}' 1.txt

awk工作代码,无前导空格,支持多列空格,从第n列开始打印:

awk '{ print substr($0, index($0,$column_id)) }' 1.txt


请阅读问题first@meso_2600呃,对不起,我想你是说吵架。我会使用
cut
。一次又一次地更新了答案。请阅读问题,它是awk或sed;)我读过了。然而,
cut
显然是适合这项工作的工具。通常情况下,像“使用工具A或B执行此操作”这样的问题是不受欢迎的,因为您已经在问题中提出了可能错误的解决方案。为什么你要被迫使用
awk
sed
?@meso_2600我无法重现这一点。上面的示例显示了如何打印从第二列到最后一列。如果你的“真实”问题与问题中描述的问题不同,那么我应该如何给出正确答案?效果很好。只是想知道什么是CaveAshmm现在的问题是,如果我想从第二列开始使用$1=$2=“”,这甚至适用于第n列。不,它不适用,因为后面的列中有多个空格请将您的问题显示为预期的输出。这段代码不适用于GNU awk。您使用的是什么awk?在旧版本中,使用
gawk--re interval'…'
是的,很有效。但是更短的,不需要子标题已经作为回答问题发布了,如果其中一条线包含的列少于定义的第n列,它就会被打印出来。修正:awk'{for(i=0;它对第n列(第2列或第3列)不起作用)“不起作用”不是一个很清楚的问题描述。不管怎样,我对它做了一点修改(使用
*
而不是
+
)。我想它现在应该做你期望的事情了。这只是幼稚的否决正确答案:)回答很好。可能会失败:两个不同的列中有相同的内容。请分享示例,因为我无法重现此类问题。我可以看到问题。谢谢。您的回答对其他人来说是正确的:
echo foo bar baz bar | awk-v column_id=4'{print substr($0,index($0,$column_id))}“
将打印太多columns@hek2mgl这不是另一个问题的重复。stackoverflow上发布的所有以前的问题/解决方案都有相同的问题:附加空格被替换为单个空格。并非所有问题都有此问题。请参阅的答案,例如。等等-这是您的问题!您接受了正确的answ呃差不多一年前,现在你又回来问同样的问题了。发生了什么事?
awk '{sub(/^([^[:blank:]]+[[:blank:]]+){1}/, "", $0); print}' 1.txt
awk '{ print substr($0, index($0,$column_id)) }' 1.txt