![변수 출력이 연결되지 않았습니다](https://linux55.com/image/107357/%EB%B3%80%EC%88%98%20%EC%B6%9C%EB%A0%A5%EC%9D%B4%20%EC%97%B0%EA%B2%B0%EB%90%98%EC%A7%80%20%EC%95%8A%EC%95%98%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
두 개의 서로 다른 변수의 출력을 연결하는 스크립트가 있습니다. 문제는 두 변수의 출력에 여러 줄이 포함되어 있다는 것입니다. 그래서 출력이 내가 기대했던 것과 다릅니다.
첫 번째 변수 및 출력:
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
두 번째 변수 및 출력:
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개의 여러 줄 변수가 있는 경우 여러 가지 방법으로 결합할 수 있습니다.
테스트용 변수 선언
$ 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"
Bash 루프를 사용하여 각 변수에서 한 줄을 읽습니다.
while read -u3 prefix; read -u4 suffix; do echo "$prefix$suffix" done 3<<<"$snap_prefix" 4<<<"$snap_daily"
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 스크립트를 사용하여 모든 파일의 결과를 결합하는 것입니다. 그러나 더 자세한 내용이 필요합니다. 어쩌면 새로운 질문일 수도 있습니다.