파일의 헤더를 구문 분석하고 헤더를 기반으로 파일의 값을 바꿉니다.

파일의 헤더를 구문 분석하고 헤더를 기반으로 파일의 값을 바꿉니다.

다음 파일이 있습니다

Field1|Field2|Field3|Field4|Field5
a|b|c|d|e
1|2|3|4|5
z|y|x|w|v

두 개의 입력을 허용하는 스크립트가 있습니다

script.sh Field3 T

script.sh는 "Field3" 매개변수를 사용하고 해당 열 번호에 따라 내용을 "T"로 바꿉니다.

[편집하다]

@Costas의 다음 제안을 시도했지만 문제가 발생했습니다. 내 파일은 다음과 같습니다.

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2~Y~N~~0

다음 스크립트를 실행하면

cat <filename> | awk -F'~' -v p='MODULE_ColumnD' -v r='99' 'NR==1{for (i=1;i<=NF;i++) if($i==p)f=i;print;next}$f=r'

값을 바꾸지만 다음과 같이 출력에서 ​​구분 기호가 누락되거나 공백으로 대체됩니다.

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2 Y N 99 0

레코드에서 구분 기호를 다시 얻는 방법은 무엇입니까?

답변1

awk -F'|' -v p='Field3' -v r='T' '
    NR==1{
        for (i=1;i<=NF;i++)
            if ($i==p)
               f=i
        print
        next}
    $f=r
'

사용하기 위해 형식을 지정하려면 다음과 같이 script.awk저장하세요.

#!/usr/bin/awk -f
BEGIN{
    OFS=FS="|"}
NR==1{
    for (i=1;i<=NF;i++)
        if ($i==p)
            f=i
    print
    next}
$f=r

그리고 실행 가능하게 만들고 다음을 통해 사용하십시오 chmod +x script.awk.

./script.awk p=Field4 r=T input.file

관련 정보