열이 하나만 있는 경우 어떻게 파일에 열을 추가할 수 있습니까(가급적이면 sed -i 사용)?

열이 하나만 있는 경우 어떻게 파일에 열을 추가할 수 있습니까(가급적이면 sed -i 사용)?

다음과 같은 데이터 열이 있다고 가정해 보겠습니다.

sample123
sample456
samplexyz

다음을 사용하여 두 개의 새 열을 쉽게 추가할 수 있습니다.

sed -i "s/$/\t1.1\tC/" <file.txt>

그것은:

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C

이제 맨 아래에 몇 가지 새로운 데이터를 추가한다고 가정해 보겠습니다.

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C
sampleNew1
sampleNew2
sampleNew3

이 데이터의 새 열을 추가하려고 하면 모든 행에 추가되므로 이제 다음을 실행하면 됩니다.

sed -i "s/$/\t1.2\tA/" <file.txt>

다음과 같이 보입니다:

sample123   1.1 C   1.2 A
sample456   1.1 C   1.2 A
samplexyz   1.1 C   1.2 A
sampleNew1  1.2 A
sampleNew2  1.2 A
sampleNew3  1.2 A

첫 번째 열 외에 다른 열이 없는 열을 추가하는 방법은 무엇입니까?

답변1

먼저 현재 줄에 탭 문자가 있는지 테스트하고 그렇지 않은 경우 바꾸십시오.

sed -i '/\t/!s/$/\t1.2\tA/' file

여기서는 탭 문자를 포함하지 않는 모든 줄을 가져와 /\t/!이 줄에 대체를 적용합니다.

위의 내용은 GNU가 탭 문자를 sed인식한다고 가정합니다. \t다른 sed구현에서는 대신 텍스트 탭을 사용해야 할 수도 있습니다 \t. 다른 sed구현에서도 -i이 옵션을 GNU와 다르게 처리 할 수 있습니다 sed("sed -i(제자리에서 편집)를 사용하여 이식성을 달성하는 방법은 무엇입니까?").


사용 awk:

awk -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

그러면 탭으로 구분된 필드의 수를 테스트하고 필드가 하나만 있는 경우 줄을 인쇄하기 전에 새로운 두 번째 및 세 번째 필드를 추가합니다.

이는 파일을 현재 위치로 변경하지 않습니다. 이렇게 하려면 awk다음과 같이 GNU를 사용하십시오.

awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

awk내부 편집 에 대한 자세한 내용은 "awk를 사용하여 파일을 영구적으로 변경하는 방법은 무엇입니까? ("내부" 편집, "sed -i"와 동일)".

관련 정보