Item Name Data Price Comment
shoes Nike 20 Expensive item
pencil Cheap price
bag Most expensive
목표는 2열과 3열의 탭 정보를 고려하여 4열의 값을 얻는 것입니다.
을 사용하면 awk '{print $4,$5}'
예상한 출력을 얻지만 두 번째 행에 대해 이 작업을 수행하면 데이터가 올바르지 않습니다.
답변1
데이터가 탭으로 구분되어 있고 네 번째 열을 원하는 경우 cut
다음 옵션과 함께 사용하세요 -f 4
.
cut -f 4 file
이 cut
유틸리티는 탭 문자를 기본 구분 기호로 사용합니다.
명령 awk
에 사용되는 기본 필드 구분 기호 awk
는 연속 공백(탭 또는 공백)입니다. 을 사용하여 -F '\t'
입력 필드 구분 기호를 awk
탭으로 변경할 수 있습니다. awk
위 명령과 동일한 작업을 수행하는 방법을 확인하세요.cut
awk -F '\t' '{ print $4 }' file
Miller( )와 같은 약간 "고급" TSV 인식 도구를 사용하면 mlr
이름으로 열의 주소를 지정할 수도 있습니다.
mlr --tsv cut -f Comment file
이는 데이터를 TSV("Tab Separated Values")로 읽고 Comment
각 입력 레코드(행)에 대한 필드를 추출합니다.
("TSV 인식"은 인용된 필드를 통해 awk
추가 도움 없이는 수행할 수 없는 CSV 파일에서와 마찬가지로 해당 필드에 탭과 줄바꿈을 포함할 수 있다는 것을 알고 있음을 의미합니다.)
답변2
사용행복하다(이전 Perl_6)
정규 표현식이 당신의 친구라는 말부터 시작하겠습니다. 실제로 5개가 아닌 4개의 열이 있습니까? 1) 제목/본문 "단어 간격"을 밑줄로 변환하고, 2) 탭을 쉼표나 파이프로 변환(또는 다른 적절한 대체:)하여 열을 빠르게 시각화할 수 있습니다.
~$ raku -pe 's:g/\x0020/_/;' < file > tmp1
~$ cat tmp1
Item_Name Data Price Comment
shoes Nike 20 Expensive_item
pencil Cheap_price
bag Most_expensive
#그런 다음:
~$ raku -pe 's:g/\t/|/;' < file > tmp2
~$ cat tmp2
Item_Name|Data|Price|Comment|
shoes|Nike|20|Expensive_item
pencil|||Cheap_price
bag|||Most_expensive
실제로 네 번째 열(0 인덱스 = 3)을 추출하기 위해 이 시점의 코드는 다음과 같이 단순화됩니다.
~$ raku -ne 'put .split("|").[3] // "";' tmp2
위의 코드는 빈 줄을 유지합니다. 빈 줄을 제거하려면 다음 명령을 사용하세요.
~$ raku -ne '.put with .split("|").[3];' tmp2
올바른 열이 있다고 확신하면 처음부터 원본 파일에 위의 코드를 매개변수 .split("\t")
(예: 분할 on )를 사용하여 실행하세요 tab
.
출력 예(원본 파일, 분할 \t
):
Comment
Expensive item
Cheap price
Most expensive