쉼표로 구분된 다양한 숫자가 포함된 출력 파일이 있습니다. 문제는 쉼표의 개수를 모른다는 것입니다.
나는 이 데이터를 다른 파일로 가져오고 싶습니다. 예를 들어:
나는 다음과 같은 정보를 가지고 있습니다:10,20,30,55,58,47,52,100
나는 사용한다
awk '{split($0,a,","); for (i=1; i<=8; i++) print a[i]}' TMPFILE
데이터를 추출합니다. 그러나 for
루프를 실행하는 데 얼마나 오랜 시간이 필요한지 모르겠습니다 .
10과 같은 숫자를 얻으면 grep
data.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를 사용하고 싶지 않다면 xargs
sed를 사용하여 패턴 파일을 만드세요.
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
그 다음에..