쉼표 사이의 데이터 추출

쉼표 사이의 데이터 추출

쉼표로 구분된 다양한 숫자가 포함된 출력 파일이 있습니다. 문제는 쉼표의 개수를 모른다는 것입니다.

나는 이 데이터를 다른 파일로 가져오고 싶습니다. 예를 들어:

나는 다음과 같은 정보를 가지고 있습니다:10,20,30,55,58,47,52,100

나는 사용한다

awk '{split($0,a,","); for (i=1; i<=8; i++) print a[i]}' TMPFILE

데이터를 추출합니다. 그러나 for루프를 실행하는 데 얼마나 오랜 시간이 필요한지 모르겠습니다 .

10과 같은 숫자를 얻으면 grepdata.txt에서 가져와야 하고, 그런 다음 data.txt에서 20을 얻는 식으로 마지막 숫자까지 계속해야 합니다.

답변1

AKW:

echo '10,20,30,55,58,47,52,100' | \
awk '{x=split($0,a,","); for (i=1; i <= x; ++i) print a[i]}'

awk는 필드 구분 기호를 사용합니다.

echo '10,20,30,55,58,47,52,100' | \
awk -F ',' '{for(i=1; i <= NF; ++i) print $i}'

sed:

 echo '10,20,30,55,58,47,52,100' | sed 's/,/\n/g'

그러면 명령은 다음과 같습니다.

sed 's/,/\n/g' TMPFILE | xargs -I'{}' grep '{}' data.txt

또는 xargs어쩌면 다음을 사용하여:

xargs -a TMPFILE -d, -I'\x' grep '\x\{1\}' data.txt

또는 might를 사용하고 싶지 않다면 xargssed를 사용하여 패턴 파일을 만드세요.

sed 's/\([^,]\+\),*/^\1$\n/g' TMPFILE | \
grep -o -f /proc/self/fd/0 data.txt

또는,

tr ',' '\n' < TMPFILE | \
grep -f /proc/self/fd/0 data.txt

그것은 모두 당신이 무엇을 어떻게 grep하고 싶은지에 달려 있습니다.

답변2

동일한 파일을 반복적으로 grep하려면 셸 루프를 사용해 볼 수도 있습니다.

IFS=,
for i in $(cat csvfile)
do
  grep "$i" datafile
done > outfile

스크립트나 서브셸에 넣지 않으면 다음이 필요합니다.

oldIFS=$IFS

이전과

IFS=$oldIFS

그 다음에..

관련 정보