我对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
我很感激任何帮助! 在此先感谢:)
答案 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)