comm
다른 테이블 파서의 출력을 사용하고 싶습니다. 그러나 일관되지 않은 구분선이 생성되는 것 같습니다.
예를 들어:
$ comm <(echo "1\n2") <(echo "2\n3") | bat -A --style=plain
1␊
├──┤├──┤2␊
├──┤3␊
나머지 탭이 채워지지 않기 때문에 CSV로 변환할 수 없습니다.
$ comm <(echo "1\n2") <(echo "2\n3") | tr \\t ,
1
,,2
,3
그리고 탭으로 구분할 수도 없습니다.
$ comm <(echo "1\n2") <(echo "2\n3") | xsv input -d \\t
1
CSV error: record 1 (line: 2, byte: 2): found record with 3 fields, but the previous record has 1 fields
comm
올바른 형식의 테이블을 생성하는 방법이 있습니까 ? 내가 본 옵션은 예상보다 더 많이 작동하는 것 같습니다.
- 정규식으로 대체
- 각 열을 별도로 인쇄
답변1
다음을 수행할 수 있습니다.
$ comm <(echo "1\n2") <(echo "2\n3") | awk -F'\t' -v OFS=, '{NF=3;print}'
1,,
,,2
,3,
필드 수를 3으로 awk
강제 하고 입력 필드 구분 기호 TAB를 출력 필드 구분 기호 로 변환합니다 .N
F
F
O
F
S
,
gawk, mawk 또는 busybox awk에서는 작동하지만 원래 nawk에서는 작동하지 않습니다. 단, 변경으로 인해 NF
레코드가 새로운 OFS로 재생성되지는 않습니다. 또는 다음을 수행할 수 있습니다.
$ comm <(echo "1\n2") <(echo "2\n3") | awk -F'\t' -v OFS=, '{$3=$3;print}'
1,,
,,2
,3,
이는 모든 최신 버전에서 작동하며 awk
출력이 다음과 같이 보장됩니다.적어도필드 3개(입력 파일에 탭 문자가 포함된 경우 적용 가능 comm
)
답변2
비록 예쁘지는 않지만 정규식 솔루션을 생각해 낼 수 있었습니다.
$ comm <(echo "1\n2") <(echo "2\n3") | sed -E 's/^\t\t([^\t]*)$|^\t([^\t]*)$|^([^\t]*)$/\3,\2,\1/'
1,,
,,2
,3,
입력 내용에 탭이나 쉼표가 있으면 작동하지 않습니다.