특정 필드에 대한 unix txt 파일 형식

특정 필드에 대한 unix txt 파일 형식

file1.dat다음 내용을 포함하는 구분된 텍스트 파일입니다. 해당 열의 $COL각 구분 기호에 텍스트 문자열을 추가하여 세 번째 열을 변경하고 싶습니다.#

모든 줄에 대해 이 작업을 수행하고 동일한 이름으로 파일을 저장하고 싶습니다.

누구든지 도와줄 수 있나요?

입력 샘플

name|class|colors|age|email
abc|xyz|#orange#green#pink#blue|16|[email protected]
pqr|xyz|#orange#green#pink#blue|20|[email protected]

원하는 출력

name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]

답변1

$COL귀하의 예에서는 로 시작하는 줄의 각 문자열 끝에 추가하려고 합니다 #. 이 간단한 경우에는 다음과 같이 간단히 수행할 수 있습니다.

$ sed -E 's/(#[^#|]*)/\1$COL/g' file
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]

또는 sed지원하지 않는 경우 -E:

sed 's/\(#[^#|]*\)/\1$COL/g' file

-i다음을 사용하여 해당 위치에서 파일을 편집 할 수 있습니다 .

sed -i -E 's/(#[^#|]*)/\1$COL/g' file

보다 일반적인 경우, 구분된 문자열 $COL에 대한 추가 내용을 바꾸려면 #세 번째 구분된 필드에서만 |다음을 수행할 수 있습니다.

$ awk -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1' file 
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]

최신 버전의 GNU에서는 다음을 사용하여 파일을 편집 awk할 수 있습니다 .-i inplace

awk -iinplace -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1'

#마지막으로, 재미를 위해 Perl을 사용하여 모든 -defend 문자열을 변경할 수도 있습니다 .

perl -pe 's/(#[^#|]+)/$1\$COL/g' file 

또는 세 번째 열에서 다음을 수행합니다.

perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g; print join "|",@F' file 

또는 세 번째 열에서 이 작업을 수행하고 첫 번째 행을 건너뜁니다.

perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g if $.>1; print join "|",@F' file 

두 경우 모두 -i파일을 그 자리에서 편집할 수 있습니다.

관련 정보