2014-10-11 1 views
0

2011.txt, 2012.txt2013.txt의 세 가지 탭으로 구분 된 값 데이터 파일이 있다고 가정합니다. 각 파일의 형식은 다음과 같습니다.다른 데이터 파일에 데이터가없는 데이터 파일에서 행을 삭제하는 방법

UserID Data Data Data ... 

각 파일에는 이름이 지정된 연도의 데이터 만 들어 있습니다. 전 또는 다음 해에 출연하지 않는 UserID에 대해이 파일의 모든 데이터를 버리고 싶습니다. 즉, 적어도 2 년 동안 사용자 ID를 추적 할 수있는 사용자 ID와 관련된 데이터 만 유지하려고합니다. 어떻게이 일을 할 수 있습니까? 이와 같이 데이터 파일을 조작하는 데 사용하는 내 도구는 vim이며 간단한 명령 인 perl과 regexp를 사용합니다. 이러한 도구를 사용하여이 작업을 수행 할 수있는 방법이 있다면 그렇게 할 수 있습니다. 그러나 나는 새로운 도구를 배우는 것에 열렬합니다.

run through each UserID in 2011.txt 
    if UserID doesn't appear in 2012.txt, delete this row from 2011.txt 
run through each UserID in 2012.txt 
    if UserID doesn't appear in either 2011.txt or 2013.txt, delete this row from 2012.txt 
run through each UserID in 2013.txt 
    if UserID doesn't appear in 2012.txt, delete this row from 2013.txt 

을하지만이 같은 여러 파일을 액세스하는 방식으로 파일을 수정 한 적이 : 개요로

, 나는 생각하고있다.

답변

1

사용이 :

#!/bin/bash 
while (("$2")); do 
    cut $2 -f1 | sed 's/^/\^/' > p.$2 
    grep $1 -f p.$2 > $1.new 
    shift 
done 
rm -rf p.* 

예 :

$ cat 2011 
1 d1 d2 
2 d1 d2 
3 d1 d2 
4 d1 d2 
5 d1 d2 
6 d1 d2 

$ cat 2012 
1 d1 d2 
3 d1 d2 
4 d1 d2 
6 d1 d2 
7 d1 d2 
8 d1 d2 

$ cat 2013 
1 d1 d2 
2 d1 d2 
4 d1 d2 
5 d1 d2 
6 d1 d2 
8 d1 d2 
10 d1 d2 

하는 실행 스크립트를

./script 2011 2012 2013 

두 개의 새로운 파일을

$ cat 2011.new 
1 d1 d2 
3 d1 d2 
4 d1 d2 
6 d1 d2 

$ cat 2012.new 
1 d1 d2 
4 d1 d2 
6 d1 d2 
8 d1 d2 
+0

하세요 대답을 편집하여 코드가 작동하는 방식과 OP 문제를 해결하는 방법에 대한 설명을 추가하십시오. 많은 SO 포스터는 초보자이며 게시 한 코드를 이해하지 못합니다. –