我有桌子
M - A A -
- A G - -
M - - - G
我想执行:如果第一行的任何列包含“-”,则跳过打印该列
预期的输出是
M A A
- G -
M - -
我尝试过这样的事情,但没有奏效
awk 'NR==1 && $i!="-" {print $i}'
有谁知道如何更正命令?
Ed Morton 答案的变体,它通过字段编号记住哪些字段不在
-
第一行,然后根据数组中保存的索引重新形成输入中的每个记录,out
然后打印新记录:在这里,我牺牲了一些效率来提高可读性,方法是在单独的循环中重建记录,而不是在第二个块的单个循环中打印所需的字段。
测试:
使用制表符作为输出字段分隔符运行:
取决于制表符分隔的输入数据的稍长的单行:
这用于将不在第一行的字段编号
awk
输出为逗号分隔的列表。然后将该列表移交给文件中数据的实际输出。请注意,文件名(这里简称为 )在命令行中给出了两次,一次是 for ,然后是.-
cut -f
file
awk
cut
awk
隐式循环输入记录(行)和文件,但不是您必须明确执行的字段。在您的情况下,您需要遍历第一行(标题)中的字段以决定要包含哪些列,然后遍历每一行(标题和非标题)中的字段以在该行中包含所需的列。您不清楚是否要查找等于(字符串)“-”或可能将其作为(子)字符串的标题字段。我还假设您有(所有)单个选项卡作为字段分隔符,而不是多个空格,这会更乏味(并且无法从您的帖子中直观区分)。
使用 Perl。
对于第一行,构建一个字段为非破折号的索引数组
@A
。然后对于所有行,包括第一行,只打印
@F
索引在 中的那些字段@A
。输出:
我们可以
sed
使用backslashitis
.方法是从第一行创建地图。要保留的字段映射为 x 其他作为破折号。将此地图保存在货舱中。
然后对于所有行,附加此地图并在 BOL 处放置一个标记。
在循环中,如果我们看到 \n- 并且将标记前进到下一个字段,我们会继续删除当前行的前导字段。
当此标记与当前行和保持空间之间的换行符冲突时,循环结束(由于 G 命令)。
结果