gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:30:58 24 4
gpt4 key购买 nike

我有一个带有标题的 csv 文件:

a,b,c,d,e,f,g,h
我想做点什么
cat abc.csv | sed "something to split them" | grep "e"  

#position of "e"
有人可以指导我如何获取标题“e”所在的列 idx?

最佳答案

假设您的目标是说“该值在哪一列”,您有多种选择,但这有效:

sed -n $'1s/,/\\\n/gp' abc.csv | grep -nx 'e'
#output: 5:e

如果您只想从中获得数字:
sed -n $'1s/,/\\\n/gp' abc.csv | grep -nx 'e' | cut -d: -f1
#output: 5

解释:

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

该表达式使用 ANSI 引号( $' ... ' )只是为了更易于阅读:您可以在其中添加一个换行符 \n而不是必须包含文字换行符。无论如何,当 shell 完成它时,表达式 $'1s/,/\\\n/gp'作为 1s/,/\
/gp
传递给 sed ,它告诉它用换行符替换第一行中的每个逗号,然后打印出结果。您的示例中仅 sed 的输出将是这样的:
a
b
c
d
e
f
g
h

(如果您的 CSV 文件有很多行,您可能需要将 ;q 添加到 sed 命令的末尾,以便它在第一行之后退出,而不是继续阅读并对其余行不做任何操作。)

然后我们通过一个 grep 管道该输出命令寻找 e .我们通过 -x选项,以便它只匹配完全由 'e' 组成的行,而不仅仅是包含 'e' 的任何行(感谢 @Marcel 和 @Sundeep),加上 -n选项,告诉它在其输出中包含匹配行的行号。在示例中,它输出 5:e ,其中 5:表示输出的其余部分来自输入的第 5 行。

然后我们可以通过 cut 管道它带有 -d 的字段分隔符 ( : )只提取第一个字段( -f1 ),它是 sed 输出中的行号 - 这是原始文件中的字段号。

关于shell - 如何在unix shell中获取字段的列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39781994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com