我有一个带头文件的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?
假设你的目标是说"哪一列是这个值",你有很多选择,但这有效:
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文件有很多行,您可能希望添加;q到sed命令的末尾,以便它在第一行之后退出,而不是继续读取而不对其余行执行任何操作.)
然后我们通过grep查找命令来管道输出e.我们传递-x选项,使其仅匹配由'e'组成的行,而不仅仅是包含'e'的任何行(感谢@Marcel和@Sundeep),以及-n告诉它包含匹配行的行号的选项它的输出.在示例中,它输出5:e,其中输出5:的其余部分来自输入的第5行.
然后,我们可以cut使用字段分隔符(-d):来管道,以便仅提取第一个字段(-f1),这是sed输出中的行号 - 这是原始文件中的字段编号.
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)