1

私は現在、csvファイルの内容を再配置するスクリプトに取り組んでいます。これに似た行があった場合:

stack,over,flow,dot,com

コマンドで区切られた文字列内の文字列/単語の場所を特定するにはどうすればよいですか。したがって、たとえば、スタックを検索すると1が返され、フローを検索すると3が返されます。私はこれを行う方法をいくつか考えましたが、それらはほとんどが長く引き出されたスクリプトであるため、これを行うためのより短い/より簡単な方法があるかもしれないと感じています。誰かがアドバイス/助けを提供することができれば、私は本当に感謝します、ありがとう。また、これはbash環境で実行されています

4

8 に答える 8

3

awkワンライナー:

awk -F, -vs=$search '{for (i=1;i<=NF;i++)if($i~"^"s"$"){print i;exit;}}{print "not found"}' yourString

(以下のテスト例を参照してください)

kent$  l="stack,over,flow,dot,com"
kent$  echo $l
stack,over,flow,dot,com
kent$  search=over
kent$  echo $search
over    
kent$  awk -F, -vs=$search '{for (i=1;i<=NF;i++)if($i~"^"s"$"){print i;exit;}}{print "not found"}' <<<$l
2
kent$  search=foobar    
kent$  awk -F, -vs=$search '{for (i=1;i<=NF;i++)if($i~"^"s"$"){print i;exit;}}{print "not found"}' <<<$l 
not found
于 2012-11-12T16:38:19.783 に答える
2
echo $line | awk -F, '{
  for(i=1;i<=NF;i++){
    if($i=="your_string") print i;
  }
}'

注:NFはフィールド数の略です。

于 2012-11-12T16:38:51.147 に答える
1

bash関数:

position() {
    local search=$1
    local IFS=,
    local i=1
    set -- $2
    for word; do
        if [[ $word = $search ]]; then
            echo $i
            return
        fi
        ((i++))
    done
    echo -1
}

それで:

$ position stack stack,over,flow,dot,com
1
$ position tack stack,over,flow,dot,com
-1
于 2012-11-12T17:33:34.627 に答える
1

100%bashソリューションを要求したという理由だけで(これはsed、awk、seqなどを使用しません):

L='stack,over,flow,dot,com'
IFS=,
set -- $L
declare -A A
for ((i=1; i<=$#; i++))
do
    A[${!i}]=$i
done

# where's flow?
echo "flow=${A[flow]}"
于 2012-11-13T03:54:05.487 に答える
0

一致する文字列までコンマを数えることができます。

for word in stack over flow dot com ; do
    echo $word
    grep -o ".*$word" <<< stack,over,flow,dot,com \
    | grep -o , \
    | wc -l
done

ただし、CSVでさらに操作を行いたい場合は、Perlに切り替えてText::CSVを使用するのがよいでしょう。

于 2012-11-12T16:25:41.863 に答える
0

行を分割し、行番号を検索します

sedで行を分割してから、一致する行番号を見つけることができます。例えば:

search_term='flow'
echo 'stack,over,flow,dot,com' |
    sed -e  's/,/\n/g' |
    sed -ne "/^${search_term}\$/ {=; q}"

sedは行指向であるため、一致する行番号を検索する前に、まずファイル全体を変換する必要があります。そのため、現在のプロセスで2番目の式を使用するのではなく、sedの別のインスタンスにパイプしています。

これを行う方法は確かに他にもありますが、これは簡単です。YMMV。

于 2012-11-12T16:32:58.680 に答える
0

sedそしてgrepこれまでに表されました。awk解決策は次のとおりです。

echo "stack,over,flow,dot,com" | awk -F, '{ for (i=1; i < NF; ++i) if ($i == "flow") print i; }'
于 2012-11-12T16:40:50.990 に答える
0

すべての単語を検索するとします。

$ LINE=stack,over,flow,dot,com
$ read ${LINE//,/\ } rest < <(echo $(seq 100))
$ echo $stack $over $flow $dot $com
1 2 3 4 5

もちろん、それは簡単に名前の衝突を引き起こす可能性があるので、名前の前に何かを付けたいと思うかもしれません:

$ LINE=stack,over,flow,dot,com
$ read field_${v//,/\ field_} rest < <(echo $(seq 100))
$ echo $field_stack $field_over $field_flow $field_dot $field_com
1 2 3 4 5
于 2012-11-13T01:52:38.563 に答える