想象我有以下字符串:
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
答案 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]}
来获得相同的输出。