获得等于X的列号

时间:2016-07-27 14:06:58

标签: bash awk sed

想象我有以下字符串:

1 0 1 1 1

获取等于“1”的列号的简单实现是:

for column_number in $(seq 1 5); do
  zero_or_one=$(echo "1 0 1 1 1" | cut -d' ' -f$column_number)
  if [ "$zero_or_one" -eq "1" ]; then
    echo "$column_number"
  fi
done

然而,由于我的琴弦往往很长,这个循环需要很长时间(约1分钟)。 有没有其他方法使用例如awk,sed,...来获得等于“1”或“0”的列号?

如果我正在寻找“1”,

预期输出:

1
3
4
5
如果我正在寻找“0”,

预期输出:

2

2 个答案:

答案 0 :(得分:3)

你的问题并不清楚,但这可能是你想要的:

$ awk -v RS=' ' '$0{print NR}' <<<'1 0 1 1 1'
1
3
4
5

$ awk -v RS=' ' '!$0{print NR}' <<<'1 0 1 1 1'
2

答案 1 :(得分:1)

这看起来像你应该想要的东西:

awk '{ for (i = 1; i <= NF; ++i) if ($i == 1) print i }' <<<'1 0 1 1 1'

遍历字段,比较它们的值并打印匹配的字段。

尽管如此,值得一提的是,您也可以提高现有方法的性能:

while read -ra cols; do
    for (( i = 1; i <= ${#cols[@]}; ++i )); do
        [[ ${cols[i-1]} -eq 1 ]] && echo "$i"
    done
done <<<'1 0 1 1 1'

这使用本机shell命令而不是执行单独的进程来获取每个值,因此它比循环快得多。

请注意,该数组是零索引的,因此我使用${cols[i-1]}来获得相同的输出。