![0이 아닌 모든 결과를 "1"로 대체하여 존재/부재를 형성합니다.](https://linux55.com/image/103911/0%EC%9D%B4%20%EC%95%84%EB%8B%8C%20%EB%AA%A8%EB%93%A0%20%EA%B2%B0%EA%B3%BC%EB%A5%BC%20%221%22%EB%A1%9C%20%EB%8C%80%EC%B2%B4%ED%95%98%EC%97%AC%20%EC%A1%B4%EC%9E%AC%2F%EB%B6%80%EC%9E%AC%EB%A5%BC%20%ED%98%95%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4..png)
탭으로 구분된 테이블이 있습니다.
a b c
A 5 2 0
B 0 5 4
C 4 3 4
D 2 0 2
열이나 행 이름을 변경하지 않고 0이 아닌 값을 "1"로 변경하고 싶습니다.
원하는 출력:
a b c
A 1 1 0
B 0 1 1
C 1 1 1
D 1 0 1
이를 명확히 하기 위해 다음은 예제 테이블입니다. 이 문자는 열/행 이름을 나타내는 변수입니다. 수백 개의 열과 행이 있을 수 있습니다. 0이 아닌 값(여기서 숫자로 지정됨)은 반드시 숫자일 필요는 없습니다. 예를 들어 사람의 이름일 수 있습니다.
답변1
엄격하게 탭으로 구분된 입력을 가정하면 다음과 같습니다.
$ cat data.in
a b c
A nancy bilbo baggins 0
B 0 darcy bender
C phantom menace Unix !!
D last row 0 the end
$ cat -t data.in
^Ia^Ib^Ic
A^Inancy^Ibilbo baggins^I0
B^I0^Idarcy^Ibender
C^Iphantom menace^IUnix^I!!
D^Ilast row^I0^Ithe end
awk
작업을 수행하는 스크립트:
BEGIN { OFS = FS = "\t" }
NR != 1 {
for (i = 2; i <= NF; ++i) {
if ($i != "0") {
$i = "1";
}
}
}
{ print }
실행하세요:
$ awk -f script.awk data.in
a b c
A 1 1 0
B 0 1 1
C 1 1 1
D 1 0 1
스크립트는 0
각 필드(열)를 단일 문자(첫 번째 필드 제외)와 비교하여 0
로 출력합니다 1
. 출력은 탭으로 구분됩니다.
답변2
sed '1!s/ [^ ]*[^ 0][^ ]*/ 1/g'
0
공백 이외의 문자가 하나 이상 포함된 공백이 아닌 문자의 시퀀스는 (첫 번째 줄 제외) 로 대체됩니다 .1
IOW, 이는 0 시퀀스와 첫 번째 열 및 행을 제외한 모든 항목을 대체합니다 1
.
답변3
제목에 귀하의 예와 같은 숫자가 포함되어 있지 않다는 점을 고려할 때 제가 생각할 수 있는 가장 쉬운 방법은 다음과 같습니다.
sed 's/[1-9]/1/g' file.txt
참고 범위: 1~9(0 제외)
$ echo "A 5 2 0" |sed 's/[1-9]/1/g'
A 1 1 0
이 방법은 열의 숫자가 최대 9인 경우에 작동합니다. 그렇지 않고 그 수가 10개 이상이 될 수 있다면 수정해야 합니다.
OP의 최신 설명에 따르면 0이 아닌 항목은 이름 등이 될 수 있으므로 작동하지 않습니다.
답변4
이것은 bash에서만 작동합니다.
bash$ paste <(cut -f1 file) <(cut -f2- file |
sed -r '1b; # if title line then skip to end
s#\t#\n#g # seperate line to multi-line
s#.*[^0].*#1#Mg # apply multi-line operation
s#\n#\t#g' ) # turn to one line
a b c
A 1 1 0
B 0 1 1
C 1 1 1
D 1 0 1