如何在unix shell中获取字段的列索引

ace*_*ner 4 unix shell sed

我有一个带头文件的csv文件:

A,B,C,d,E,F,G,H

我想做点什么

cat abc.csv | sed "something to split them" | grep "e"  

#position of "e"
Run Code Online (Sandbox Code Playgroud)

有人可以指导我如何获得标题'e'所在的列idx?

Mar*_*eed 8

假设你的目标是说"哪一列是这个值",你有很多选择,但这有效:

sed -n $'1s/,/\\\n/gp' abc.csv | grep -nx 'e'
#output: 5:e
Run Code Online (Sandbox Code Playgroud)

如果你想得到的数字:

sed -n $'1s/,/\\\n/gp' abc.csv | grep -nx 'e' | cut -d: -f1
#output: 5
Run Code Online (Sandbox Code Playgroud)

说明:

由于标题位于文件的第一行,我们使用该-n选项告诉sed默认情况下不打印所有行.然后我们给它一个表达式,从表示开头1,意味着它只在第一行执行,并以...结束p,这意味着该行后来打印出来.

该表达式使用ANSI引号($'... '),因此更容易阅读:您可以在其中添加换行符,\n而不必包含文字换行符.无论如何,当shell完成它时,表达式$'1s/,/\\\n/gp'将传递给sed as 1s/,/\ /gp,这告诉它用换行符替换第一行上的每个逗号,然后打印出结果.你的例子中只有sed的输出是这样的:

a
b
c
d
e
f
g
h
Run Code Online (Sandbox Code Playgroud)

(如果您的CSV文件有很多行,您可能希望添加;qsed命令的末尾,以便它在第一行之后退出,而不是继续读取而不对其余行执行任何操作.)

然后我们通过grep查找命令来管道输出e.我们传递-x选项,使其仅匹配由'e'组成的行,而不仅仅是包含'e'的任何行(感谢@Marcel和@Sundeep),以及-n告诉它包含匹配行的行号的选项它的输出.在示例中,它输出5:e,其中输出5:的其余部分来自输入的第5行.

然后,我们可以cut使用字段分隔符(-d):来管道,以便仅提取第一个字段(-f1),这是sed输出中的行号 - 这是原始文件中的字段编号.

  • 我不知道-x @Sundeep.真是太美了!我也纳入了我的答案.谢谢! (2认同)

Mar*_*cel 5

  1. head正在选择第一行(header);
  2. tr替换了换行符的定界符;
  3. grep选择的行恰好包含所需的字符串(子字符串将被忽略),并且行号也会显示出来。在示例中,我们将有5:e ;
  4. cut使用' '作为定界符并选择第一列。因此仅显示行号。

head -n1 abc.csv | tr "," "\n" | grep -nx e |  cut -d":" -f1
Run Code Online (Sandbox Code Playgroud)

档案内容:

a,b,c,d,e,f,g,h
Run Code Online (Sandbox Code Playgroud)

您想要的字符串:

e
Run Code Online (Sandbox Code Playgroud)

输出:

5
Run Code Online (Sandbox Code Playgroud)