当 K 列为空时使用 AWK/Perl 提取行

发布于 2024-09-03 00:41:59 字数 245 浏览 3 评论 0原文

我的数据如下所示:

foo 78 xxx
bar    yyy
qux 99 zzz
xuq    xyz

它们是制表符分隔的。 如何提取第 2 列为空的行,产生

bar    yyy
xuq    xyz

我尝试过此操作但似乎不起作用:

awk '$2==""' myfile.txt 

I have data that looks like this:

foo 78 xxx
bar    yyy
qux 99 zzz
xuq    xyz

They are tab delimited.
How can I extract lines where column 2 is empty, yielding

bar    yyy
xuq    xyz

I tried this but doesn't seem to work:

awk '$2==""' myfile.txt 

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

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

发布评论

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

评论(3

空城仅有旧梦在 2024-09-10 00:41:59

您需要将字段分隔符专门设置为 TAB 字符:

> cat qq.in
  foo     78      xxx
  bar             yyy
  qux     99      zzz
  xuq             xyz
> cat qq.in | awk 'BEGIN {FS="\t"} $2=="" {print}'
  bar             yyy
  xuq             xyz

awk 的默认行为是将 FS 视为 SPACE< /kbd>(默认值)作为特殊情况。从手册页:

FS 是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符运行分隔。 (我的斜体)

You need to specifically set the field separator to a TAB character:

> cat qq.in
  foo     78      xxx
  bar             yyy
  qux     99      zzz
  xuq             xyz
> cat qq.in | awk 'BEGIN {FS="\t"} $2=="" {print}'
  bar             yyy
  xuq             xyz

The default behaviour for awk is to treat an FS of SPACE (the default) as a special case. From the man page:

In the special case that FS is a single space, fields are separated by runs of spaces and/or tabs and/or newlines. (my italics)

口干舌燥 2024-09-10 00:41:59
perl -F/\t/ -lane 'print unless $F[1] eq q//' myfile.txt

命令开关

  • -F 告诉 Perl 在什么分隔符上自动分割(本例中为制表符)
  • -a 启用自动分割模式,在指定的位置分割每一行填充数组的分隔符 @F
  • -l 自动在每个打印行的末尾附加换行符 "\n"
  • -n 逐行处理文件
  • -e 将第一个带引号的参数视为代码而不是文件名
perl -F/\t/ -lane 'print unless $F[1] eq q//' myfile.txt

Command Switches

  • -F tells Perl what delimiter to autosplit on (tabs in this case)
  • -a enables autosplit mode, splitting each line on the specified delimiter to populate an array @F
  • -l automatically appends a newline "\n" at the end of each printed line
  • -n processes the file line-by-line
  • -e treats the first quoted argument as code and not a filename
通知家属抬走 2024-09-10 00:41:59
grep -e '^.*\t\t.*

将 grep 由字符-制表符-制表符-字符组成的每一行(制表符之间没有任何内容)。

myfile.txt

将 grep 由字符-制表符-制表符-字符组成的每一行(制表符之间没有任何内容)。

grep -e '^.*\t\t.*

Will grep each line consisting of characters-tab-tab-characters (nothing between tabs).

myfile.txt

Will grep each line consisting of characters-tab-tab-characters (nothing between tabs).

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