タグ付けされた質問 「array」

配列は、アイテムを継続的にメモリに格納するための最も単純なデータ構造です

6
要素の長さに従って配列をバッシュソートしますか?
文字列の配列がある場合、各要素の長さに従って配列をソートしたいと思います。 例えば... array=( "tiny string" "the longest string in the list" "middle string" "medium string" "also a medium string" "short string" ) ソートする必要があります... "the longest string in the list" "also a medium string" "medium string" "middle string" "short string" "tiny string" (おまけとして、リストが同じ長さの文字列をアルファベット順に並べ替えるといいでしょう。上記の例では、同じ長さでもmedium string前に並べ替えられmiddle stringていました。しかし、解決)。 配列がインプレースで並べ替えられている(「配列」が変更されている)場合、または新しい並べ替えられた配列が作成された場合は問題ありません。

2
配列のループで、配列に要素を追加します
bashのforループに問題があります。例:配列があり("etc" "bin" "var")ます。そして、私はこの配列について繰り返します。しかし、ループでは、配列に値を追加したいと思います。例えば array=("etc" "bin" "var") for i in "${array[@]}" do echo $i done これは表示されますetc bin var(もちろん、別々の行に表示されます)。そして、私doがそのように追加した場合: array=("etc" "bin" "var") for i in "${array[@]}" do array+=("sbin") echo $i done 私は欲しい:(etc bin var sbinもちろん別々の行に)。 これは機能していません。どうすればできますか?
9 bash  array  for 

4
複数のディレクトリをfindの-pruneオプションに渡す
findバックアップファイルの検索と削除に使用していますが、特定のディレクトリを検索から除外したいと考えています。バックアップファイル名はで終了する可能性があり.bck、bak、~、またはbackup。 除外するディレクトリが3つだけのMinimal Working Example(MWE)コードは次のとおりです。 #! /bin/bash find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put 構文\( -path "dir1" -o -path "dir2" ... …

2
Gawk:配列を関数に渡す
GNU awk 3.1.6で立ち往生し、配列のバグを回避したと思いますが、600行のawkプログラムでスコープの問題のように見えます。私のバグを見つけるには、awkの配列スコープの理解を確認する必要があります。 この実例のawkコードを考えると... function foo(ga) { ga[1] = "global result" } garray[1] = "global" foo(garray) print garray[1] 印刷されます... global result 配列は常に参照によって関数に渡されるため、すべての配列は常にグローバルです。ローカル配列を作成する方法はありません。これは正しいです?明示的に言っているドキュメントを見つけることができませんでした。 私がデバッグしているので、3.1.6自体にこの領域の既知のバグがあるため、awkのバグがどこに留まり、自分のバグがどこから始まるのかを特定しようとしています。 補足:ga []が関数内で機能するのはなぜですか? まず、配列を関数に渡すことfoo(ga)は実際には不要です。garray[]関数内からアクセスするだけです。ただし、それを実行しても測定可能なパフォーマンスの低下はなく、デバッグとエラー報告に役立ちます。 を使用する場合foo(ga)、ga[]はグローバル配列の同義語ですgarray[]。のローカルコピーでgarray[]はgarray[]なく、シンボリックリンクがファイルへのポインターであるように、単にへのポインターであり、同じファイル(または配列)に複数の名前でアクセスできます。 補足:グレン・ジャックマンの回答の明確化 関数の外で作成された配列は関数に対してグローバルであり、関数に渡されるか、関数内で参照されるだけですが、関数内で作成された配列は実際には関数に対してローカルのままであり、関数の外からは見えません。ジャックマン氏の例を修正すると、これがわかります... awk ' function bar(x,y) { split("hello world", y) print "x[1] inside: " x[1] print "y[1] inside: " y[1] } BEGIN { …
9 awk  function  array 

1
zshの配列とループ
でループと配列操作を学習しようとしていますzsh。 たとえば、zshに2つの配列があり、未知の要素数が同じで、それぞれにパスのリストが含まれているとします。 LOCAL_ARRAY=($LOCAL_PATH_1 $LOCAL_PATH_2 $LOCAL_PATH_3) REMOTE_ARRAY=($REMOTE_PATH_1 $REMOTE_PATH_2 $REMOTE_PATH_3) 両方の配列を共通のインデックスで同時に反復処理して、次のようなことができるようにしたいと思います。 cd $LOCAL_PATH_i hg pull $REMOTE_PATH_i 各反復で。zshでこれを行うにはどうすればよいですか? また、zshのドキュメントでループ制御と配列を検索しましたが、ほとんど成功しませんでした。zshのループ、配列などの基本を紹介する優れたチュートリアルはありますか?bashやシェルスクリプトの経験はほとんどないが、プログラミングの経験がある人のために何かありますか?
9 zsh  array 

4
配列内のすべての要素を間接的に返す
Bashのマニュアルページで${!a}は、名前の内容a(間接参照のレベル)である変数の内容を返すためのの使用について説明しています。 これを使用して配列内のすべての要素を返す方法を知りたい、つまり、 a=(one two three) echo ${a[*]} 戻り値 one two three 私がしたい: b=a echo ${!b[*]} 同じを返すために。残念ながら、そうではありませんが、0代わりに戻ります。 更新 返答を考えると、私の例はもちろん次のようなものなので、単純すぎることに気づきました。 b=("${a[@]}") 私が必要と言ったことを正確に達成します。 だから、これが私がやろうとしていたことです: LIST_lys=(lys1 lys2) LIST_diaspar=(diaspar1 diaspar2) whichone=$1 # 'lys' or 'diaspar' _LIST=LIST_$whichone LIST=${!_LIST[*]} もちろん、Bashのmanページを注意深く読むと、最後の行が単に$_LIST(配列ではなく)「配列」のインデックスを返すため、これは期待どおりに機能しないことがわかります。 いずれにせよ、(指摘されたように)次の作業を行う必要があります。 LIST=($(eval echo \${$_LIST[*]})) または...(最終的に私が行ったルート): LIST_lys="lys1 lys2" ... LIST=(${!_LIST}) もちろん、その要素に空白が含まれていないと仮定します。
9 bash  array 

5
Bash配列でのパラメーター置換の使用
Bash配列に読み込む必要があるfile.txtがあります。次に、スペース、二重引用符、およびすべてのエントリの最初のカンマを除くすべてを削除する必要があります。これが私がどこまで得たかです: $ cat file.txt 10,this 2 0 , i s 30,"all" 40,I 50,n,e,e,d,2 60",s e,e" $ cat script.sh #!/bin/bash readarray -t ARRAY<$1 ARRAY=( "${ARRAY[@]// /}" ) ARRAY=( "${ARRAY[@]//\"/}" ) for ELEMENT in "${ARRAY[@]}";do echo "|ELEMENT|$ELEMENT|" done $ ./script.sh file.txt |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| |ELEMENT|50,n,e,e,d,2| |ELEMENT|60,se,e| コンマの状況を除いて、それは素晴らしい働きをします。この猫のスキンを作成する方法は複数あることは承知していますが、これは一部のスクリプトが大きいため、ここに到達するにはパラメーター置換を使用したいと思います。 |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| …

2
複数のテキストソースの最初の行から配列を作成するにはどうすればよいですか?
それぞれ数行のテキストを持つファイルへのパスの配列があります。次のように処理された各ファイルの最初の行が入力された配列を作成したいと思います。 # this.txt first line is [Test this] # another.txt first line is [Test another] paths=( ./this/path/this.txt ./another/path/another.txt ) for i in ${paths[@]}; do read -r line < $i lines+=$line done せいぜい、配列で取得した値は1つだけです。forループから探している配列を取得できないようです。私は多くのバリエーションを試しましたが、どこが間違っているのかを理解するのに苦労しました。

1
文字列で配列要素を参照し、awkで配列を初期化する
#!/usr/bin/env bash awk ' BEGIN { arr[A]=1; arr[B]=1; arr[C]=1; arr[E]=1; arr[J]=8; arr[Q]=10; print arr[J] }' 上記のコマンドは、の最新の設定値を出力します。arr['subscript']この場合10は、arr[Q]直前の値であり、の値ではprintありません。8arr[J] また、上記のスクリプトのように、一度に1行ずつarr['A'], arr['B'], arr['C'] and arr['E']同じ値を持つ値に値を割り当てたくはありません1。代わりに、パラメータの1つとして添え字の配列を渡し、他のパラメータとして共通の値を渡します。それらに値を割り当てるロジック。
8 awk  array 

4
bashで配列値をシフトする方法
例として6つのマウントポイントフォルダーを構築する /data/sdb /data/sdc /data/sdd /data/sde /data/sdf /data/sdg だから私たちは配列を使ってこの簡単なbashスクリプトを書きました folder_mount_point_list="sdb sdc sdd sde sdf sdg" folderArray=( $folder_mount_point_list ) counter=0 for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6 do folder_name=${folderArray[counter]} mkdir /data/$folder_name let counter=$counter+1 done 今、私たちはせずに、コードを変更したいカウンタとしましょう= $カウンタ=カウンタ+ 1 次の配列値を取得するために各ループを配列にシフトすることは可能ですか? のようなものとして ${folderArray[++]}

8
ファイルのパス名の配列をベース名でソートします
配列に保存されているファイルのパス名のリストがあるとします filearray=("dir1/0010.pdf" "dir2/0003.pdf" "dir3/0040.pdf" ) ファイル名のベース名に従って配列の要素を番号順に並べ替えたい sortedfilearray=("dir2/0003.pdf" "dir1/0010.pdf" "dir3/0040.pdf") どうやってやるの? 私はそれらのベースネーム部分のみをソートできます: basenames=() for file in "${filearray[@]}" do filename=${file##*/} basenames+=(${filename%.*}) done sortedbasenamearr=($(printf '%s\n' "${basenames[@]}" | sort -n)) 私は考えています キーがベース名で値がパス名である連想配列を作成するため、パス名へのアクセスは常にベース名を介して行われます。 ベース名のみの別の配列を作成sortし、ベース名配列に適用します。 ありがとう。
8 bash  filenames  sort  array 


3
配列を関数に渡す最も正しい方法は何ですか?
私が非常に大きな配列を持っていると考えてください$large_list、配列を引数としてとる関数を書く方法はありますか?例えば: echo_idx_array () { arr="$1" idx="$2" echo "${arr[$idx]}" } そのようなことをするための通常の戦略は何ですか?変数を指定してみまし$large_listたが、空でした。 引数リストの変更に合わせて関数を変更するつもりです。 記録のために、私はksh88を使用しており、可能な限りポータブルな答えを探しています。 編集:これまでのところ私が思いつくことができる最善の方法は、配列をループして、各要素を関数の引数として送信することです。これは信じられないほど醜く、エラーが発生しやすいようです。言うまでもなく、すぐに制限に達します。これが私がしたことです: foo () { echo $* } cmd="foo " while [[ $i -lt $MAX_ARR_SIZE ]]; do cmd="$cmd ${large_list[$i]}" ((i=i+1)) done eval $cmd 何か良いことはありませんか?
8 shell  ksh  array 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.