#x 열과 해당 열 #y 값에서 고유한 값을 추출하는 방법은 무엇입니까?

#x 열과 해당 열 #y 값에서 고유한 값을 추출하는 방법은 무엇입니까?

n개의 열이 있는 csv 형식의 쉼표 ',' FS 파일 이름이 있습니다. 고유한 값을 추출해야 합니다.colm.#1해당 값만 가짐colm.#10. 따라서 기본적으로 열 10은 날짜이며 colm.#1다른 열이 있음에도 불구하고 항상 고유합니다.

문서 내용 filename:

colm.#1 colm.#2 colm.#3 colm.#4 colm.#5 colm.#6 colm.#7 colm.#8 colm.#9 colm.#10    colm.#11
    a   231 412 30.84873962 3   1   1   2013    5/28/2013   6/6/2006    299
    c   12  41  66.80690765 3   1   1   2014    5/25/2014   4/4/2004    351
    d   35  6   25.91622925 3   1   2   2013    6/27/2013   3/3/2003    303
    d   352 55  33.91288757 3   1   2   2014    6/26/2014   3/3/2003    355
    a   86  3   30.58783722 3   1   3   2013    7/24/2013   6/6/2006    307
    c   15  3242    26.6435585  3   1   3   2014    7/24/2014   4/4/2004    359
    e   67  1   22.95526123 3   1   4   2013    8/21/2013   5/5/2005    311
    a   464 64  4.804824352 3   1   4   2014    8/20/2014   6/6/2006    363
    b   66  42  29.42435265 3   1   5   2014    9/18/2014   7/7/2007    367
    m   24  2   66.10663319 3   1   6   2014    10/13/2014  9/9/2009    371

다음 명령을 시도했지만 작동만 colm.#1하고 colm.#10.

cut -d',' -f1 filename |uniq

예상되는 출력은 다음과 같습니다.

a   6/6/2006
b   7/7/2007
c   4/4/2004
d   3/3/2003
e   5/5/2005
m   9/9/2009

답변1

awk -F, 'NR > 1 && ! seen[$1 FS $10]++ {print $1, $10}' filename | sort -k1,1

산출

a 6/6/2006
b 7/7/2007
c 4/4/2004
d 3/3/2003
e 5/5/2005
m 9/9/2009

답변2

awk '{if ( ! ( $1 in Peers)) { Peers[$1]=$1 " " $10; print Peers[$1]} }' YourFile

결과를 정렬해야 하는 경우 shel(입력 또는 출력) 또는(GNU awk 사용)에서 수행하면 순차적으로 수행됩니다.

awk '{if ( ! ( $1 in Peers)) Peers[$1]=$1 " " $10 } END{asort(Peers);for (Peer in Peers) print Peers[ Peer]}' YourFile

답변3

잘라내기를 사용하여 여러 필드를 인쇄하려면 다음을 수행하세요.

cut -d (SELECT DELIMITER) -f 1,10

-f 1,10지정된 필드만 선택하세요.

특정 라인을 타겟팅하는 경우 다음을 수행할 수 있습니다. grep -w a filename | cut -d (SELECT DELIMITER) -f 1,10

위의 예에서는 문자 "a"와 정확히 일치하는 항목을 찾고 있습니다. 즉, "사과"는 너무 많지 않지만 "a"는 너무 많습니다.

답변4

사용행복하다(이전 Perl_6)

Raku에서 단일 "열"을 기반으로 행을 "고유"하는 일반적인 방법은 다음과 같습니다.

raku -e '.put for lines.unique: :as(*.words[9]);'

위의 코드는 unique열 1(일명)에 있는 값에 해당하는 전체 행을 인쇄합니다 :as(*.words[0]). 따라서 열 1과 10만 필요한 경우 해당 항목을 선택하십시오(0 인덱스) words.

raku -e '.words[0,9].put for lines.unique: :as(*.words[9]);'

words동일한 한 줄에 두 번 호출하는 것은 비효율적일 수 있으므로 given테마화 도구를 사용하여 함수 호출을 추상화할 수 있습니다.

raku -e 'given lines.map(*.words) { .[0,9].put for .unique: :as(*.[9]) };' 

아니면 그냥 for반복자를 사용하세요:

raku -e ' .[0,9].put for lines.map(*.words).unique( :as(*.[9]) ) ;' 

헤더 행을 제외하고는 simple-tsv 파일을 거의 처리할 수 있습니다. 헤더를 처리해야 할 경우 put먼저 헤더를 꺼내십시오. 상태 저장형 이므로 lines헤더 뒤의 첫 번째 데이터 행부터 읽기를 재개합니다.

~$ raku -e 'lines.head(1).words.[0,9].put; \
          .[0,9].put for lines.map(*.words).unique( :as(*.[9]) ) ;'  file

입력 예:

colm.#1 colm.#2 colm.#3 colm.#4 colm.#5 colm.#6 colm.#7 colm.#8 colm.#9 colm.#10    colm.#11
a   231 412 30.84873962 3   1   1   2013    5/28/2013   6/6/2006    299
c   12  41  66.80690765 3   1   1   2014    5/25/2014   4/4/2004    351
d   35  6   25.91622925 3   1   2   2013    6/27/2013   3/3/2003    303
d   352 55  33.91288757 3   1   2   2014    6/26/2014   3/3/2003    355
a   86  3   30.58783722 3   1   3   2013    7/24/2013   6/6/2006    307
c   15  3242    26.6435585  3   1   3   2014    7/24/2014   4/4/2004    359
e   67  1   22.95526123 3   1   4   2013    8/21/2013   5/5/2005    311
a   464 64  4.804824352 3   1   4   2014    8/20/2014   6/6/2006    363
b   66  42  29.42435265 3   1   5   2014    9/18/2014   7/7/2007    367
m   24  2   66.10663319 3   1   6   2014    10/13/2014  9/9/2009    371

출력 예(위의 최종 코드):

colm.#1 colm.#10
a 6/6/2006
c 4/4/2004
d 3/3/2003
e 5/5/2005
b 7/7/2007
m 9/9/2009

마지막으로 .sort위의 최종 코드 끝에 추가하여 a,b,c,d,e,m행을 알파벳순으로 정렬할 수 있지만 (중요하게) 이것이 필수는 아닙니다.

https://raku.org

관련 정보