文字列の連結はbashでは機能しません

JeanCHilger

テキストファイルを読み取り、それに基づいてJSONキーと値のペアを作成するシェルスクリプトをコーディングしています。keyファイル名で、valueファイルのランダムなラインです。

問題は、グローバル変数のkeyを連結するときvalueですdata

次のコードを実行すると:

data='{'

for file in $(ls _params)
do
    key=${file%.txt}

    f_line=$(($$%100))
    value=$(sed "${f_line}q;d" "./_params/$file")

    # assembles key-value pairs
    data=$data\"$key\":\""value"\",
done

data=${data%?} # removes last comma
data="$data}"

echo $data

私の出力は次のとおりです。 {"firstName":"value","lastName":"value"}

ただし、次のように、文字列"value"を変数に変更$valueします。

data='{'

for file in $(ls _params)
do
    key=${file%.txt}

    f_line=$(($$%100))
    value=$(sed "${f_line}q;d" "./_params/$file")

    # assembles key-value pairs
    data=$data\"$key\":\"$value\",
done

data=${data%?} # removes last comma
data="$data}"

echo $data

出力が混乱します:"}"lastName":"Adailee

$data次のような変数に格納したいと思います。{"firstName":"Bettye","lastName":"Allison"}

注:私のbashバージョンは4.3.48です。

注:アーカイブ内_paramsには2つのファイルがfirstName.txtあり、lastName.txtどちらも各行にランダムな名前が付いています。

JawguyChooser

@ruakhが示唆しているように、特定の問題は入力ファイルです。問題を再現してこれを確認する手順は次のとおりです。

ABCDを100回繰り返したfirstNames.txtファイルを2つ作成しました。

$ cat ABCD
A
B
C
D
$ for _ in $(seq 1 100); do cat ABCD >> _params/firstName.txt

そして、lastNames.txtのWXYZと同様です。次に、スクリプトを実行しました。

$ bash q.sh 
{"firstName":"A","lastName":"W"

ただし、unix2dos(dos2unixパッケージから)これを\ r \ n行末に変換するために使用する場合

$ unix2dos _params/firstName.txt 
unix2dos: converting file _params/firstName.txt to DOS format...
$ unix2dos _params/lastName.txt 
unix2dos: converting file _params/lastName.txt to DOS format...
$ bash q.sh 
"}"lastName":"W

したがって、おそらくdos2unix入力ファイルを修正するために使用できます(または開いvimて実行:set ft=unixしてから:x)。

しかし、私はあなたに他の3つのことについて知らせたかったのです。

  1. $$は乱数ではなく、現在のプロセスのPIDです。
  2. ベストプラクティスは、解析することlsはなく、代わりにglobbingを使用することです1
  3. 空の区切り文字で開始し、ループの最初の反復後にコンマに設定することで、配置したばかりのコンマを削除せずにフェンスポストの問題を解決できます。

スクリプトを改善するための私の提案は次のとおりです(入力の改行を修正したら):

#!/bin/bash
data='{'
sep=""

for file in _params/*
do
  key=${file%.txt}
  file_length=$(wc -l < ${file})
  f_line=$(( (RANDOM % file_length) + 1 ))
  value=$(sed "${f_line}q;d" "${file}")

  # assembles key-value pairs
  data="${data}${sep} \"$key\":\"$value\""
  sep=","
done

data="${data} }"

echo $data

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

列全体のtidyverse連結文字はc_acrossでは機能しません

分類Dev

C連結文字列は機能しません

分類Dev

8086で指定された2つの文字列を連結します+ MOVSBは機能しません

分類Dev

Bash -vテストは、4.3.46の連想配列では機能しません

分類Dev

最後の文字の削除は、連結後のループの最初の実行では機能しません

分類Dev

単一の文字列での文字列分割は機能しますが、パンダの一連の文字列では機能しません

分類Dev

文字列の連結と追加がforeach内で機能していません

分類Dev

「埋め込み式のルール」については、文字列の連結が機能しません

分類Dev

文字列の比較はcinでは機能しません

分類Dev

SQL UDFは文字列では機能し、列では機能しません

分類Dev

Bashのcaseステートメントは、jqを使用したjson文字列値では機能しません

分類Dev

Bashの部分文字列の比較はコマンド式では機能しません

分類Dev

.thenの連鎖は機能しません

分類Dev

文字列の一致は、特別な文字「/」では機能しません

分類Dev

PowerShell-2つの文字列をアンダースコアで連結しても機能しませんか?

分類Dev

三項演算子の2つの結果を連結すると、Javaで文字列の連結が正しく機能しません

分類Dev

Append Childは、連結された配列アイテムでは機能しません

分類Dev

matlabでの文字列変換はint値では機能しません

分類Dev

Pythonの部分文字列は整数の数値では機能しません

分類Dev

ngSwitchは文字列では機能しません

分類Dev

phpは部分文字列では機能しません

分類Dev

MySQL関数はUnicode文字列では機能しません

分類Dev

部分文字列はjquery.text()では機能しません

分類Dev

sscanf文字列形式指定子は '\ t'では機能しません

分類Dev

Convert.ToDecimalは文字列「9.02」では機能しません

分類Dev

文字列の配置はANSIカラーでは機能しません

分類Dev

SQLクエリの「CASE」は文字列値では機能しません

分類Dev

ParseUser.setEmail()は「ある種の文字列」では機能しませんか?

分類Dev

文字列の分割はバッチファイルでは機能しません

Related 関連記事

  1. 1

    列全体のtidyverse連結文字はc_acrossでは機能しません

  2. 2

    C連結文字列は機能しません

  3. 3

    8086で指定された2つの文字列を連結します+ MOVSBは機能しません

  4. 4

    Bash -vテストは、4.3.46の連想配列では機能しません

  5. 5

    最後の文字の削除は、連結後のループの最初の実行では機能しません

  6. 6

    単一の文字列での文字列分割は機能しますが、パンダの一連の文字列では機能しません

  7. 7

    文字列の連結と追加がforeach内で機能していません

  8. 8

    「埋め込み式のルール」については、文字列の連結が機能しません

  9. 9

    文字列の比較はcinでは機能しません

  10. 10

    SQL UDFは文字列では機能し、列では機能しません

  11. 11

    Bashのcaseステートメントは、jqを使用したjson文字列値では機能しません

  12. 12

    Bashの部分文字列の比較はコマンド式では機能しません

  13. 13

    .thenの連鎖は機能しません

  14. 14

    文字列の一致は、特別な文字「/」では機能しません

  15. 15

    PowerShell-2つの文字列をアンダースコアで連結しても機能しませんか?

  16. 16

    三項演算子の2つの結果を連結すると、Javaで文字列の連結が正しく機能しません

  17. 17

    Append Childは、連結された配列アイテムでは機能しません

  18. 18

    matlabでの文字列変換はint値では機能しません

  19. 19

    Pythonの部分文字列は整数の数値では機能しません

  20. 20

    ngSwitchは文字列では機能しません

  21. 21

    phpは部分文字列では機能しません

  22. 22

    MySQL関数はUnicode文字列では機能しません

  23. 23

    部分文字列はjquery.text()では機能しません

  24. 24

    sscanf文字列形式指定子は '\ t'では機能しません

  25. 25

    Convert.ToDecimalは文字列「9.02」では機能しません

  26. 26

    文字列の配置はANSIカラーでは機能しません

  27. 27

    SQLクエリの「CASE」は文字列値では機能しません

  28. 28

    ParseUser.setEmail()は「ある種の文字列」では機能しませんか?

  29. 29

    文字列の分割はバッチファイルでは機能しません

ホットタグ

アーカイブ