我需要解析命令输出的第n列 - 这个输出保证是某种类型的表,具有未定义的长度和宽度。这个表还有一个我想忽略的标题。我想通过将所需的列存储在变量中然后解析它来实现这一点。
此外,如果我想做同样的事情,但只解析包含某种模式的值,我该怎么做?我必须pipe
上面命令的输出grep
,然后将其输出存储到我解析的数组中。
示例输入和输出:
~$ myCommand <args>
TABLE HEADER: <Some explanation of what the table means>
first_cola second_cola third_cola fourth_cola ...
first_colb second_colb third_colb fourth_colb ...
first_colc second_colc third_colc fourth_colc ...
... ... ... ...
这里&#34; first_cola&#34;等是字符串。所以我需要,例如,遍历所有&#34; first_col&#34;值,也许只看具有某种模式的那些。
澄清: 用户通过输入从1到表中列数的数字来选择要查看的列,之后,可以选择从先前选择的列中选择一些值 < / em>仅选择与特定模式匹配的值。这些值应该保存到一个我将迭代的数组中。然后对所选值执行的操作与此问题无关。
答案 0 :(得分:1)
egrep '2$' < <(echo -e 'ha hb hc\na1 b1 c1\na2 b2 c2' | tail -n+2 | cut -d' ' -f2)
echo -e 'ha hb hc\na1 b1 c1\na2 b2 c2'
打印样本3x3网格tail -n+2
删除第一行标题cut -d' ' -f2
正在使用空格作为分隔符egrep '2$' < <(xxx)
在命令2
xxx
结尾的字符串
答案 1 :(得分:1)
如果您定义要跳过的行数(通常为0或1)和所需的列,则可以使用以下内容获取未过滤的输出:
myCommand '<args>' |
awk -v skip=1 -v column=4 'NR <= skip { next } { print $column }'
如果您也要过滤,可以在grep
命令后添加awk
,也可以awk
进行过滤:
myCommand '<args>' |
awk -v skip=1 -v column=4 filter='[a-z]$' \
'NR <= skip { next } { if ($column ~ filter) print $column }'
过滤第4列(仅限)以小写字母字符结尾的值。您可以通过将if
条件更改为($0 ~ filter)
来过滤整行。
通过更多工作(相当多的工作),您可以安排打印多列。您可以安排在一个灵活的脚本中处理所有这些(我有一个,但它也不支持正则表达式过滤)。
标准cut
命令对于列之间的多个分隔符不灵活,与awk
不同。有时这是一个优势;有时这是一个缺点。
你能解释
'NR <= skip { next } { print $column }'
的作用吗?
NR <= skip { next }
部分将当前记录编号NR
与变量skip
中的值进行比较;如果当前记录号小于或等于要跳过的号码,则它会执行next
,这意味着跳到下一个输入记录(不要在脚本中执行任何操作)。
{ print $column }
部分有一个空模式(或条件),所以它始终是&#39;执行。它打印变量column
中的数字指定的列中的数据。
变量skip
和column
由命令行-v skip=1 -v column=4
设置。