AWK命令打印到行尾

时间:2013-06-13 15:50:17

标签: shell unix awk

我对AWK命令有一个快速的问题。我需要打印命令直到同一行的行结束,但是当它到达下一行时,我需要它在另一行上打印。以下示例将提供更好的清晰度。

说我有一个文件:

0 1 2 3 This is line one
0 1 2 3 This is line two 
0 1 2 3 This is line three 
0 1 2 3 This is line four

我尝试了以下内容并获得了以下结果

awk '{for(i=5;i<=NF;i++) print $i}' fileName >> resultsExample1

我在resultsExample1

中获得以下内容
This
is
line
one
This 
is 
line 
two 
And so on....

示例2:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample2

for resultsExample2我得到:

This is line one This is line two this is line three This is line four

我也尝试过:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample3

但结果与之前的结果相同

最后我想要以下内容:

This is line one
This is line two 
This is line three
This is line four

我很感激任何帮助! 在此先感谢:)

5 个答案:

答案 0 :(得分:10)

我知道这个问题很老,但另一个例子是:

awk '{print substr($0,index($0,$5))}' fileName

它的作用: 找到你想要开始打印的索引($ 0的索引为$ 0)并从该索引开始打印$ 0的子字符串。

答案 1 :(得分:8)

使用cut

可能更直截了当
$ cut -d' ' -f5- file
This is line one
This is line two 
This is line three 
This is line four

这表示:在空格分隔的字段上,从第5行打印到行尾。

如果您在字段之间碰巧有多个空格,您可能最初想要使用tr -s' '来挤压它们。

答案 2 :(得分:8)

或与awk

awk '{$1=$2=$3=$4=""; sub(/^  */,"", $0); print }'  awkTest2.txt
This is line one
This is line two
This is line three
This is line four

此外,您的解决方案几乎就在那里,您只需强制在每个已处理行的末尾打印'\ n',即

awk '{for(i=5;i<=NF;i++) {printf $i " "} ; printf "\n"}' awkTest2.txt
This is line one
This is line two
This is line three
This is line four

请注意,您的BEGIN { " " }是无操作。您应该使用$i而不是$1来打印当前的迭代值。

IHTH。

修改;注意到sudo_O异议,我在数据中添加了%s。这是输出

This is line one
This is line two
This is line three
T%shis is line four

这对您来说可能是一个问题,所以在这种情况下会读到如何将格式字符串传递给printf。

答案 3 :(得分:0)

awk '{gsub (/[[:digit:]]/,"");{$1=$1}}1' file

答案 4 :(得分:0)

sed 为这个问题提供了最佳解决方案

公认的基于剪切的解决方案存在的问题是,与 awk 不同,它假设字段之间恰好有一个空格。

使用 tr -s ' ' 将多个相邻空格压缩到一个空格中的通常解决方法也有问题:它会折叠行尾剩余部分中的空格,从而修改它,正如@inopinatus 评论的那样。

以下基于 sed 的解决方案将实现我们的目标,同时在行的其余部分保留空格:

sed -E 's/^([^ \t]*[ \t]*){4}//' <<'EOF'
0 1 2 3 This is line one
0 1 2 3 This is line two   test of extra spaces
0 1 2 3 This is line three
0 1 2 3 This is line four
EOF

结果:

This is line one
This is line two   test of extra spaces
This is line three
This is line four

我们模拟了 awk 通过空格序列分隔字段的默认行为。

<块引用>

字段通常由空格序列(空格、制表符和换行符)分隔
Default Field Splitting (The GNU Awk User’s Guide)