특정 열(첫 번째 열 아님)의 값을 기준으로 행 선택

특정 열(첫 번째 열 아님)의 값을 기준으로 행 선택

file.csv파일의 여섯 번째 열 이 user_ids_to_keep.csv.

내가 읽고 싶은 파일은 file.csv다음과 같습니다.

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,2       
2013,1,5,2,1,3       
, etc.

일치하는 ID를 얻는 user_ids_to_keep.csvID 목록 은 다음과 같습니다.

1    
3    
5    
, etc.    

output.csv내가 만들려는 파일은 다음과 같아야 합니다.

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,3       
,etc. 

만약 열사용자 IDfile.csv 파일 중 첫 번째 파일입니다. 명령을 사용할 수 있다고 생각합니다.

grep -Fwf

하지만 지금은 이 문제를 어떻게 해결해야 할지 모르겠습니다.

답변1

파일 표시:

head *

...산출:

==> file.csv <==
Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,2       
2013,1,5,2,1,3  

==> user_ids_to_keep.csv <==
1    
3    
5  

보기 흉한 POSIX 코드(한 줄로 복사 가능):

{ read x ; echo $x ; \
  while read x ; \
  do for f in `cat user_ids_to_keep.csv` ; \
     do n=${x#${x%,*},} ; \
         if [ $n = $f ] ; \
         then echo $x ; \
              continue ; \
         fi ; \
     done ; \
  done ; } < file.csv | tee output.csv

보여주다:

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**
2013,1,5,2,1,1
2013,1,5,2,1,3

답변2

한 줄로 작성할 수 있습니다.

paste -sd '' user_ids_to_keep.csv | sed 's/[ \t]*//' | xargs -i@ sed -n '/,[@][ \t]*$/p' file.csv

설명하다:

paste -sd '' user_ids_to_keep.csv

개행 없이 한 줄에 파일 데이터를 출력합니다.

sed 's/[ \t]*//'

이전 출력에서 ​​모든 공백을 제거합니다.

xargs -i@ sed -n '/,[@][ \t]*$/p' file.csv

변수 "@"의 이전 출력을 패턴으로 사용하여 file.csv의 각 줄 끝을 비교하고 패턴이 일치하면 인쇄합니다.

관련 정보