有没有一种方法可以在BASH中使用cut命令来打印带有字符的特定列?

时间:2019-07-13 05:54:35

标签: bash shell

我知道我可以使用-f1来打印一列,但是有没有一种方法可以让剪切路径在列中查找特定的字符串并打印出该列?

2 个答案:

答案 0 :(得分:1)

不清楚是否是您要的内容,但是:

$ cat input
Length,Color,Height,Weight,Size
1,2,1,4,5
7,7,1,7,7
$ awk 'NR==1{for(i=1;i<=NF+1;i++) if($i==h) break; next} {print $i}' h=Color FS=, input
2
7

答案 1 :(得分:0)

您可以通过以下小函数来找出列号:

function select_column() {
    file="$1"
    sep="$2"
    col_name="$3"
    # get the separators before the field:
    separators=$(head -n 1 "${file}" | sed -e"s/\(.*${sep}\|^\)${col_name}\(${sep}.*\|$\)/\1/g" | tr -d -c ",")
    # add one, because before the n-th fields there are n-1 separators
    ((field_no=${#separators}+1))
    # now just call cut and skip the first row by using tail -n +2
    cut -d "${sep}" -f ${field_no} "${file}" | tail -n +2
}

通过以下方式调用:

select_column testfile.csv "," subno

它输出:

10
76
55
83
30
53
67
25
52
16
57
86
2
75
28

在以下testfile.csv上:

rand2,no,subno,rand1
john,8017610,10,96
ringo,5673276,76,42
ringo,9260555,55,19
john,7565683,83,72
ringo,8833230,30,35
paul,1571553,53,55
john,9972467,67,80
ringo,922025,25,88
paul,9908052,52,1
john,6264216,16,19
paul,4350857,57,3
paul,7253386,86,50
john,3426002,2,57
ringo,1437775,75,85
paul,4384228,28,77