2016-09-17 4 views
3

고유 한 문자열로 레이블 된> 100 개의 열이있는 데이터 프레임이 있습니다. 1 열은 색인 변수를 나타냅니다. 기본 UNIX 명령을 사용하여 인덱스 열 (열 1) + grep을 사용하여 특정 열 문자열을 추출하고 싶습니다.grep을 사용하여 열 추출

예를 들어, 내 데이터 프레임처럼 보이는 경우 다음

Index A B C...D E F 
p1  1 7 4 2 5 6 
p2  2 2 1 2 . 3 
p3  3 3 1 5 6 1 

은 내가 GREP으로 지정에만 열 "X"를 추출하기 위해 몇 가지 명령을 사용하여, 두 열을 표시하고 싶습니다 1 & 난 grep'd 열. 첫 번째 비트는 컷 -f1 myfile을 사용할 수 있지만 열마다 grep에 대한 도움이 필요하다는 것을 알고 있습니다. 내 그렙 문구가 "B"인 경우에 좀 더 구체적인 예를 들어, I 출력이되고 싶습니다 :

Index B 
p1  7 
p2  2 
p3  3 

내가 UNIX에 새로운 오전 및 이와 유사한 예에서 많이 발견하지 않았습니다. 어떤 도움을 많이 주시면 감사하겠습니다!

awk '{print $1,$3}' <namefile> 

이 간단한 명령은 파일의 ($ 3) 컬럼 ($ 1) 첫 번째와 세 번째 인쇄 허용 :

+2

awk를 살펴보십시오. –

+0

두 번째 행에 'p1a p1b p1c ... p1f'와 같은 값을 입력하여 질문을 명확하게 할 수 있습니다. –

+0

완료! 열의 값 (헤더 옆)은 검색과 관련이 없습니다. – AMS

답변

3

첫 번째 그림은 열 번호를 찾을 수 있습니다. 당신이 번호를 알고 나면

columnname=C 
sed -n "1 s/${columnname}.*//p" datafile | sed 's/[^\t*]//g' | wc -c 

는 사용

cut -f1,$(sed -n "1 s/${columnname}.*//p" datafile | 
    sed 's/[^\t*]//g' | wc -c) < datafile 

을 완료

cut -f1,3 < datafile 

하나의 명령으로 결합

을 잘라? 아니요, 첫 번째 sed 명령을 개선해야합니다. 한 헤더가 다른 헤더의 하위 문자열 일 수 있습니다. 일치하는 탭을 포함시키고 탭을 대체 문자열에 다시 넣습니다.

+0

정말 고마워요. 첫 번째 sed가 ... 내 열 이름을 어떻게 설정하든 상관없이 "1"을 출력하도록이 명령에 문제가 있습니까? – AMS

+0

columnname을 헤더 중 하나의 이름으로 설정 했습니까? 첫 번째 파이프가 헤더 행을 표시 할 때까지 열 이름이 과거와 동일하지 않은 부분이 작동 중입니다. 이제 두 번째'sed'를보십시오. 필드가 탭으로 분리되어 있습니까?가변 개수의 공백이있는 경우 'this one'또는 'nr of errors'와 같이 공백이있는 헤더 필드 사이에서 공백을 인식하기 어렵습니다. –

2

당신은 AWK를 사용해야합니다. 소프트웨어 awk는 실제로 훨씬 더 강력합니다. awk의 메뉴얼 페이지를 봐야한다고 생각합니다.

멋진 조합은 파이프와 함께 grep과 awk를 사용하고 있습니다. 대신, 당신은 당신이 나오지과 GREP를 대체 할 수있는 라인 번호로 라인을 선택합니다

grep 'p1' <namefile> | awk '{print $1,$3}' 

: 다음 코드는 'P1'가 포함 된 파일의 라인의 컬럼 1과 3을 출력합니다

sed 1p <namefile> | awk '{print $1,$3}' 

사실, AWK는 모든 예에서 혼자 사용할 수 있습니다 명령 밖으로

awk '/p1/{print $1,$3}' <namefile> # will print only lines containing p1 
awk '{if(NR == 1){print $1,$3}}' <namefile> # Will print only first line 
+0

감사! 이것은 매우 도움이됩니다. 열 번호를 알지 못하고 대신 열 이름을 알고있을 때 grep을 사용하여 열을 반환하기 위해 awk를 간단하게 사용할 수 있습니까? – AMS