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
행을 알파벳순으로 정렬할 수 있지만 (중요하게) 이것이 필수는 아닙니다.