간단한 쉘스크립트 문제입니다. -_-;;

netizn82의 이미지
1345
points
0
points

안녕하세요.;

PHP를 하다가 쉘스크립트를 공부할려니, 어려운게 이만저만이 아니네요 ㅠㅠ

다름이 아니라 간단한건데,


---------1.txt-----------
aaa|bbb
-------------------------

1.txt파일에 | 파이프라인을 가운데 두고 2개의 문자가 있습니다.

저걸 따로따로 출력을 하고싶은데요...

PHP에서는


$test=explode("|",$getFile);
echo $test[0];
echo $test[1];

각각 배열로 들어가지않습니까...

리눅스의 쉘스크립트에서는 어떻게해야할지.. 도저히 감을 모르겠습니다.

도움을 주세요~

---------쉘 스크립트 소스입니다.---------------


#!/bin/bash

DIR="/study/folder"
A=`ls -R $DIR | grep : | tr -d :`

for i in `echo $A`
do
  B=`ls -l $i | grep ^- | awk '{print $9}'`
  if [ "$B" != "" ]; then
    for j in `echo $B`
    do
      NEO_STR=`cat $DIR/$j`
      echo $NEO_STR 이부분 에서 "aaa|bbb" 출력
    done
  fi
done

-----------------------------------------------------

cut 을 이용 하세요.

1
point

cat "$DIR/$j" | cut -d '|' -f 1
cat "$DIR/$j" | cut -d '|' -f 2

cut -d '|' -f 1 "$DIR/$j"
cut -d '|' -f 2 "$DIR/$j"

echo "$NEO_STR" | cut -d '|' -f 1
echo "$NEO_STR" | cut -d '|' -f 2

cat 후에 cut 하는 건 낭비네요. 처음에 왜 저렇게 달았지 ㅋㅋ..

JellyPo의 이미지
1333
points

awk를 쓰면 이렇게도 됩니다.

1
point

#!/bin/bash

DIR="/study/folder"
A=`ls -R $DIR | grep : | tr -d :`

for i in `echo $A`
do
  B=`ls -l $i | grep ^- | awk '{print $9}'`
  if [ "$B" != "" ]; then
    for j in `echo $B`
    do
      NEO_STR=`cat $DIR/$j`
      gawk -F\| '{print $NEO_STR}; { print $1}; { print $2 }' 1.txt
    done
  fi
done

awk/gawk에서 개행문자(\n)를 어떻게 쓰는지 몰라서 print를 두번 사용 했습니다. 더 간단히 할 방법이 없을까요?

구분자를 |로 하기 위해서 -F 옵션 뒤에 |를 썼는데 |만 쓰면 안되더군요. \|를 써야 인식되네요.

쉘 스크립트 자체를 직접 실행해본건 아니지만 aaa bbb 분리는 잘 됩니다.

jellypo@JellyKing:~$ cat abab
aaa|bbb
jellypo@JellyKing:~$ gawk -F\| '{ print $1}; { print $2 }' abab
aaa
bbb

jg의 이미지
3065
points

echo "test,b" | awk 'BEGIN

2
points

echo "test,b" | awk 'BEGIN { FS=","; } { print $1"\n"$2; };'
echo "test,b" | awk 'BEGIN { FS=","; } { printf "%s\n%s\n", $1, $2; };'

이렇게 하시면 됩니다.

@ 저도 awk 추천합니다.
awk(mawk)가 cut이나 sed 보다 빠른 경우가 많습니다.

netizn82의 이미지
1345
points

답변 고맙습니다.

0
points

sim2e님, JellyPo님

두분모두 친절한 답변 고맙습니다. ^^

pung96의 이미지
3173
points

bash 문법만으로도

1
point

bash 문법만으로도 끝낼수 있습니다.
보통 2가지 방법을 쓰는데

1.
value = ( ${NEO_STR/|/ } )
echo ${value[0]}
echo ${value[1]}

2.
OIFS=$IFS;IFS='|';
value =($NEO_STR);
IFS=$OIFS;
echo ${value[0]}
echo ${value[1]}

jg의 이미지
3065
points

bash도 좋긴하지만

1
point

리스트는 bash의 확장기능이라서 이식적이지 못하더군요.

OIFS=$IFS;IFS='|';
for var in $NEO_STR; do echo "$var"; done
IFS=$OIFS;

이게 더 이식적이라 생각합니다.

pung96의 이미지
3173
points

좋은

2
points

좋은 지적이네요

for의 경우 문자열을 여러개의 변수로 파싱하기 좀 곤란한 면이 있죠
약간 다른 방법이기는 하지만 파일로부터 읽을 경우

OIFS=$IFS;IFS='|';
read val1 val2 < $DIR/$j
IFS=$OIFS;

echo $val1
echo $val2

같은 방법이 있습니다.

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.