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

12 浏览
0 Comments

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

这不是另一个问题的副本。

在stackoverflow上发布的所有先前问题/解决方案都存在同一个问题:额外的空格被替换为单个空格。

示例(1.txt)

文件名 Nospaces
文件名 One space
文件名 Two  spaces
文件名 Three   spaces

结果:

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

0
0 Comments

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

解决方法是引用Tom的sed答案,使用正则表达式替换来实现。代码如下:

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

然而,这段代码不起作用。

如果使用GNU awk,则没有问题。请问你使用的是哪个版本的awk?

如果使用旧版本的awk,可以使用gawk --re-interval '...'来解决。

是的,这样可以工作。但是,已经有一个更短的答案,不需要使用替换。

还有一个问题,如果某一行的列数少于定义的第n列,它会被打印出来。解决方法是使用以下代码:

awk '{for(i=0;i<[column_id];i++)sub(/[^[:space:]]+[[:space:]]*/,"")}1'

我想知道在这种情况下,:space:和:blank:有什么区别。

在这里,“space”包括“vertical”空白字符,比如换行符。

0
0 Comments

问题的出现原因是需要从第N列开始打印所有列的内容,但使用sed命令时,无法直接指定从第N列开始打印。解决方法是使用sed命令的正则表达式替换功能,通过指定不匹配第N列的模式来实现从第N列开始打印的效果。

首先,sed命令的正则表达式替换功能使用的模式是基于"field"的定义,即由任意数量的非空格字符后跟任意数量的空格字符组成。因此,可以通过正则表达式来匹配并删除第N列之前的内容。

解决方法之一是使用sed命令的-E选项来启用扩展正则表达式,并通过替换操作将第N列之前的内容删除。具体的命令是:

$ sed -E 's/([^[:space:]]+[[:space:]]*){1}//' file

其中,{1}表示只删除1个匹配项,通过将1替换为N,可以删除N个匹配项,实现从第N列开始打印的效果。

如果只需要从第一列开始打印,可以将{1}从命令中删除,具体命令是:

sed -E 's/[^[:space:]]+[[:space:]]*//' file

另一种解决方法是使用awk命令,但是使用awk命令时需要注意,当对给定记录的任一字段进行操作时,整个记录都会被重新格式化,导致每个字段之间都会被输出字段分隔符OFS(默认为单个空格)分隔开。因此,在这种情况下,使用sed命令更适合这个问题。

最后,对于使用sed命令时无法处理第二列或第三列的问题,作者进行了修改,并使用了通配符*代替+。通过这种修改,可以解决这个问题,从而实现从第N列开始打印的效果。

0
0 Comments

问题的出现原因:在使用awk或sed命令打印从第n列到最后一列时,如果文本中存在多个空格,会导致打印结果不准确。

解决方法:使用IFS选项来指定分隔符,并在awk命令中使用-F选项来避免省略多个空格。

具体解决方案如下:

awk -F "[ ]" '{$1="";$0=$0;$1=$1}1' 1.txt

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

以上命令可以正常工作,但是需要注意以下几点:

1. 使用IFS选项来指定分隔符,如-F选项后面的"[ ]"表示以空格作为分隔符。如果文本中的分隔符不是空格,需要相应修改。

2. 在awk命令中,将第一列置为空字符串的操作($1="")是为了删除第一列,使得打印结果从第二列开始。如果要从第n列开始打印,可以将$1=$n-1="",即将前n-1列都置为空字符串。

3. 在第一个解决方案中,使用了$0=$0的操作,这是为了重新设置$0变量,以便更新整行的内容。这是因为修改了某一列后,$0变量的值不会自动更新。

4. 在第二个解决方案中,使用了substr函数来截取字符串,从第二个字符(即从第二列开始)打印。

然而,以上解决方案也存在一些限制:

1. 如果后续列中存在多个连续的空格,以上命令仍然无法准确打印从第n列到最后一列的内容。因为默认情况下,awk会将连续的空格看作一个分隔符,而不会保留多个空格的信息。

2. 如果文本中的列数不固定,以上命令也无法准确打印从第n列到最后一列的内容。因为需要手动设置每一列的值为空字符串,而无法自动适应不同的列数。

以上是关于使用awk或sed命令打印从第n列到最后一列的问题的原因和解决方法的整理。希望对您有所帮助。

0