comm에서 올바른 형식의 테이블을 얻는 방법은 무엇입니까?

comm에서 올바른 형식의 테이블을 얻는 방법은 무엇입니까?

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를 출력 필드 구분 기호 로 변환합니다 .NFFOFS,

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,

입력 내용에 탭이나 쉼표가 있으면 작동하지 않습니다.

관련 정보