별도의 줄에 있는 중복 바코드를 구문 분석합니다.

별도의 줄에 있는 중복 바코드를 구문 분석합니다.

다음과 같은 데이터가 있고, column1의 중복 항목을 별도의 파일로 구문 분석해야 합니다.

예를 들어,

21288003132541:cr
21288003267289:fr
21288003758683:ph
21288003758683:tag
21288003758683:sel

이 줄을 별도의 파일로 가져오고 싶습니다 21288003758683:tag. 필요한 출력은 모든 uniq 줄과 중복된 후속 파일에 대한 별도의 파일입니다.

예를 들어 파일 1

21288003132541:cr
21288003267289:fr
21288003758683:ph

파일 2

21288003758683:tag

파일 3

21288003758683:sel

이것이 의미가 있기를 바랍니다.

감사해요

답변1

#!/bin/bash
[ $# -ge 1 ] && [ -f "$1" ] || exit
while read oneline;do
    for onecode in $oneline;do
        let count=1
        outfile="output.$count"
        [ -f $outfile ] || touch $outfile
        while grep "${onecode%:*}" $outfile >/dev/null;do
            let count+=1
            outfile="output.$count"
            [ -f $outfile ] || touch $outfile
        done
        echo "$onecode" >>$outfile
    done
done < "$1"

위 코드를 사용하면 발견된 중복 항목 수에 따라 이름이 출력.1, 출력.2 등인 여러 파일이 생성됩니다. 출력의 라인 형식이 중요한지, 아니면 작업이 끝나면 원본 파일을 바꾸고 싶은지 잘 모르겠습니다.

답변2

사전 배열을 사용하는 Python 버전입니다. 이 버전에서는 출력 순서가 유지되지 않습니다.

#!/usr/bin/env python

import fileinput

dics = []
for line in fileinput.input():
    (a, _) = line.split(':')
    for dic in dics:
        if a not in dic:
            dic[a] = line
            break
    else:
        dics.append({a: line})

for i, dic in enumerate(dics):
    with open('file%d.txt' % (i+1), 'w') as f:
        for line in dic.values():
            f.write(line)

답변3

파일을 xx에 저장한 다음 다음을 수행합니다.

touch mem; num=$(wc -l xx | awk '{print $1}');
for ((i=1 ; i<= $num ; i++ )) do
n=$(sed -n ''$i'p' xx );
nn=$(echo $n | awk -F":" '{print $1}')
grep "$nn" xx  > xx1
jj=1;  aa=$(grep "$nn" mem)
if [[ -z $aa  ]] ; then
cat xx1 | while read n ; do
echo $n >> file$jj ; 
jj=$(($jj+1)) ; 
done ;fi
echo $nn >> mem; 
done

관련 정보