打印字段“N”到行尾

发布于 2024-11-15 03:34:44 字数 203 浏览 2 评论 0原文

我想就 awk 中遇到的问题获得帮助或指导。

我有一个包含超过 5 个字段的制表符分隔文件。我想输出不包括前 5 个字段的字段。

您能告诉我如何编写 awk 脚本来完成此任务吗?

最好的, jianfeng.mao

请注意以下善意的评论:

我的文件中有很多字段。不同的行有不同数量的字段。每行的字段数不是标准的。

I would like to have help or direction on a problem I have in awk.

I have a tab-delimited file with more than 5 fields. I want to output the fields excluding the first 5 fields.

Could you please tell how to write an awk script to accomplish this task?

Best,
jianfeng.mao

Do Note the following kind comment:

There are many fields in my files. Different lines have a different number of fields. The number of fields per line is not standard.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

酒浓于脸红 2024-11-22 03:34:44

在我的制表符分隔文件 temp.txt 中,如下所示

字段1 字段2 字段3 字段4 字段5 字段6
字段1 字段2 字段3 字段4 字段5 字段6 字段7
字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8

根据您的更新,我强烈建议使用 cut

cut -f6- temp.txt

将 field6 打印到行尾。

注意 -d 指定分隔符,但制表符是默认分隔符。
您可以在 awk 中执行此操作,但我发现 cut 更简单。

使用awk,它看起来像这样:

 awk '{print substr($0, index($0, $6))}' temp.txt


如果我的制表符分隔文件 temp.txt 如下所示

字段1 字段2 字段3 字段4 字段5 字段6
字段1 字段2 字段3 字段4 字段5 字段6 字段7
字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8

awk -F"\t" '{print $6}' temp.txt

将仅打印第 6 个字段。如果分隔符是制表符,则无需设置 -F 即可工作,但我喜欢尽可能设置字段分隔符。

同样地,也会削减。

cut -f6 temp.txt

我有预感你的问题比这个更复杂,所以如果你回复我的评论,我可以尝试扩展我的答案。

In my tab delimited file temp.txt it looks like the following

field1 field2 field3 field4 field5 field6
field1 field2 field3 field4 field5 field6 field7
field1 field2 field3 field4 field5 field6 field7 field 8

As per your update, I strongly recommend using cut:

cut -f6- temp.txt

will print field6 to end of line.

Note -d specifies the delimiter, but tab is the default delimiter.
You can do this in awk, but I find cut to be simpler.

With awk it would look like this:

 awk '{print substr($0, index($0, $6))}' temp.txt


if my tab delimited file temp.txt looks like the following

field1 field2 field3 field4 field5 field6
field1 field2 field3 field4 field5 field6 field7
field1 field2 field3 field4 field5 field6 field7 field 8

awk -F"\t" '{print $6}' temp.txt

will print only the 6th field. if the delimiter is tab it will likely work without setting -F, but I like to set my field-separator when I can.

similarly so too would cut.

cut -f6 temp.txt

I have a hunch your question is a bit more complicated then this, so if you respond to my comment I can try and expand on my answer.

_蜘蛛 2024-11-22 03:34:44

我同意 matchew 使用 cut 的建议:它是完成这项工作的正确工具。但是,如果这只是成为更大的 awk 脚本的一部分,请按以下步骤操作:

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }

I agree with matchew's suggestion to use cut: it's the right tool for this job. But if this is just going to become a part of a larger awk script, here's how to do it:

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }
难理解 2024-11-22 03:34:44

perl方式?

perl -lane 'splice @F,0,5;print "@F"'

所以,

echo 'field1 field2 field3 field4 field5 field6' | perl -lane 'splice @F,0,5;print "@F"'

会产生

field6

perl way?

perl -lane 'splice @F,0,5;print "@F"'

so,

echo 'field1 field2 field3 field4 field5 field6' | perl -lane 'splice @F,0,5;print "@F"'

will produce

field6
焚却相思 2024-11-22 03:34:44
awk -vFS='\t' -vOFS='\t' '{
  $1=$2=$3=$4=$5=""
  print substr($0,6) # delete leading tabs
}'

我使用 -vFS='\t' 而不是 -F'\t' 因为 awk 的某些实现(例如 BusyBox 的)不支持后一种构造中的 C 转义。

awk -vFS='\t' -vOFS='\t' '{
  $1=$2=$3=$4=$5=""
  print substr($0,6) # delete leading tabs
}'

I use -vFS='\t' rather than -F'\t' because some implementations of awk (e.g. BusyBox's) don't honor C escapes in the latter construction.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文