sed를 사용하여 여러 특정 이벤트 교체

sed를 사용하여 여러 특정 이벤트 교체

현재 구조의 대용량 CSV 파일이 있습니다.

380670000001,<n>,0,1970-01-01 00:00:00.00+0000,0,0,<n>,0,0

교체해야 해요 "<n>"2열과 4열에"1970-01-01 00:00:00.00+0000"
교체하고"<n>"다른 열에0

현재, 나는 사용하고 있습니다스크립트:

awk 'BEGIN{FS=OFS=","}{sub("<n>","1970-01-01 00:00:00.00+0000",$2); sub("<n>","1970-01-01 00:00:00.00+0000",$4);  gsub("<n>", 0); print}' input.txt > output.txt

좀 더 우아하게 할 수 있을까요?sed?

답변1

난 그렇게 생각하지 않아. sed에는 필드 같은 것이 없으므로 하드 카운팅을 위해 정규식을 사용해야 합니다. 할 수는 있지만 충분히 우아하지는 않습니다.

r='1970-01-01 00:00:00.00+0000'
sed -E "s/^([^,]*,)<n>/\1$r/;s/^(([^,]*,){3})<n>/\1$r/;s/<n>/0/g" file

(확인하고 싶을 수도 있습니다.패턴의 일부를 보존하려면 \1을 사용하세요.역참조에 대해 모르는 경우. )

위에서 sed로 했던 것처럼 쉘 변수를 설정한 다음 awk에 전달하여 awk를 정리할 수 있습니다. 따라서 awk 스크립트에는 이제 주로 로직만 포함됩니다.

r='1970-01-01 00:00:00.00+0000'
m='<n>'
awk 'BEGIN{FS=OFS=","}{sub(m,r,$2);sub(m,r,$4);gsub(m,"0")}1' r="$r" m="$m" file

더 짧음:

awk -F, '{sub(m,r,$2);sub(m,r,$4);gsub(m,"0")}1' OFS=, r="$r" m="$m" file

답변2

아니요, sed를 사용하면 이보다 더 우아하게 수행할 수 없지만 awk에서는 더 우아하게 수행할 수 있습니다.

$ awk '
    BEGIN { FS=OFS=","; n="<n>"; r="1970-01-01 00:00:00.00+0000" }
    { for (i=2;i<=4;i+=2) if ($i == n) $i=r; gsub(n,0) }
1' file
380670000001,1970-01-01 00:00:00.00+0000,0,1970-01-01 00:00:00.00+0000,0,0,0,0,0

답변3

다음 awk 명령을 사용해보십시오

echo "380670000001,<n>,0,1970-01-01 00:00:00.00+0000,0,0,<n>,0,0"| awk -F "," '{for(i=1;i<=NF;i++){if(i ~ /2|4/){gsub("<n>","1970-01-01 00:00:00.00+0000",$i)}else{gsub("<n>","0") }}}1'

산출

380670000001,0,0,1970-01-01 00:00:00.00+0000,0,0,0,0,0

관련 정보