変数出力が接続されていません

変数出力が接続されていません

2つの異なる変数の出力を連結するスクリプトがあります。問題は、両方の変数の出力に複数の行が含まれていることです。だから、出力は私が期待したものとは異なります。

最初の変数と出力:

snap_daily=`cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | sed 's/test-for-dr-//g'`

2017-03-10-08-00
2017-03-10-11-00
2017-03-10-12-00
2017-03-10-14-00
2017-03-10-15-00

2番目の変数と出力:

snap_prefix=`cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | awk -F '2017' '{print $1}'

test-for-dr-
test-for-dr-
test-for-dr-
test-for-dr-
test-for-dr-

接続と結果のコード:

 snap_name="$snap_prefix$snap_daily"

 test-for-dr-bdmprest- test-for-dr-bdmprest- test-for-dr-bdmprest- test-for-dr-bdmprest- test-for-dr-bdmprest-2017-03-10-08-00 2017-03-10-11-00 2017-03-10-12-00 2017-03-10-14-00 2017-03-10-15-00

望ましい結果:

test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

本質的に、すべての出力ラインに一致するすべてのラインが必要です。

答え1

2つの複数行変数がある場合は、さまざまな方法で組み合わせることができます。

  1. テスト用の変数宣言

    $ snap_prefix="test-for-dr-
    test-for-dr-
    test-for-dr-
    test-for-dr-
    test-for-dr-"
    $ snap_daily="2017-03-10-08-00
    2017-03-10-11-00
    2017-03-10-12-00
    2017-03-10-14-00
    2017-03-10-15-00"
    
  2. Bashループを使用して各変数から1行を読み込みます。

    while read -u3 prefix; read -u4 suffix; do 
        echo "$prefix$suffix"
    done 3<<<"$snap_prefix" 4<<<"$snap_daily"
    
  3. pr単一ストリームを2つの列に変換する(その後、列trを区切るタブを削除)

    { echo "$snap_prefix"; echo "$snap_daily"; } | pr -2Ts | tr -d '\t'
    

2と3の両方の出力:

test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

しかし、、これはあなたが私たちに示していない入力に対してうまくいくと確信しています。

grep -Eo 'test-for-dr-[[:digit:]-]+' snaps.txt

答え2

最終目標が2ファイル内のフィールドを並べ替えて印刷することである場合は、中間snaps.txt変数やgrep-sed-awkパイプは必要なく、単一の呼び出しawkで操作を実行する必要があります。

awk '$2 ~ /test-for-dr-/{
     gsub(/[",]/, "", $2)
     match($2, "test-for-dr-")
     printf "%s%s\n", substr($2, RSTART), substr($2, 1, RSTART-1)
     }' snaps.txt

答え3

次のようにしてください。

#!/bin/bash

cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | sed 's/test-for-dr-//g' > snap_daily.txt
cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | awk -F '2017' '{print $1}' > snap_prefix.txt

a=`cat snap_daily.txt | wc -l`
let x=1
for i in `cat snap_daily.txt`
do
snap_daily=`cat snap_daily.txt | sed -n "$x"p`
snap_prefix=`cat snap_prefix.txt | sed -n "$x"p`
if [[ $x -eq $a ]]
then exit 0
fi
echo $snap_daily$snap_prefix
let x++
done

答え4

簡単な回避策は配列を使用することです。結果は改行文字で返されるからです。

$ IFS=$'\n' readarray -t a< <(echo $'2017-03-10-08-00\n2017-03-10-11-00\n2017-03-10-12-00\n2017-03-10-14-00\n2017-03-10-15-00\n')

$ IFS=$'\n' readarray -t b < <(echo $'test-for-dr-\ntest-for-dr-\ntest-for-dr-\ntest-for-dr-\ntest-for-dr-\n')

$ declare -p a b
declare -a a=([0]="2017-03-10-08-00" [1]="2017-03-10-11-00" [2]="2017-03-10-12-00" [3]="2017-03-10-14-00" [4]="2017-03-10-15-00" [5]="")
declare -a b=([0]="test-for-dr-" [1]="test-for-dr-" [2]="test-for-dr-" [3]="test-for-dr-" [4]="test-for-dr-" [5]="")

$ for ((i=0;i<"${#a[@]}";i++));do conc="${b[$i]}${a[$i]}";echo "$conc";done
test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

別の解決策は、awkスクリプトを使用してすべてのファイルの結果を結合することです。しかし、より詳細な情報が必要です。たぶん新しい質問かもしれません。

関連情報