옆

주어진 파일은 다음과 같습니다

CHrIS   john    herzog  10001   Marketing
tim             johnson 10002   IT
ruth    bertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

내 코드:

readFile=$1

#error checking to see if the file exists and is not a directory
if [ ! -f "$readFile" ]
then
    #echo failed no param passed
    exit 1
else
    #reads in the file and stores the information into the variabel var.
    while read -r var
    do
        #echo $var
        fName=$(echo "$var" | cut -f1 | awk '{print $1}')
        mName=$(echo "$var" | cut -f2 | awk '{print $2}' | tr "\t" "x")

        echo $mName
    done < $readFile
fi

2행 중간에 있는 탭을 tim (needs to be an X) johnson 10002 ITX로 어떻게 변경하나요?

답변1

이것이 {tab}공백의 문자라고 가정하면 ...

또는 이미 필드 구분 기호로 사용되었기 때문에 awk탭 문자는 표시 되지 않습니다 .trcut

빈 필드를 x. 이 경우 다음과 같은 구조를 사용할 수 있습니다.

#!/bin/bash
#
while IFS= read -r line
do
    first=$(echo "$line" | awk -F$'\t' '{print $1}')
    middle=$(echo "$line" | awk -F$'\t' '{print $2}')
    last=$(echo "$line" | awk -F$'\t' '{print $3}')
    id=$(echo "$line" | awk -F$'\t' '{print $4}')
    dept=$(echo "$line" | awk -F$'\t' '{print $5}')

    echo "First is ${first:-x}"
    echo "Middle is ${middle:-x}"
    echo "Last is ${last:-x}"
    echo "Id is ${id:-x}"
    echo "Dept is ${dept:-x}"
    echo
done

분할은 개별 인스턴스가 아닌 공백(공백, 탭, 줄 바꿈)에서 작동하므로 IFS=$'\t' read -r first middle last...분할 할 수 없습니다 . read(실제로는 그보다 더 복잡합니다. 자세한 내용은 매뉴얼 페이지에서 "단어 분할"을 찾아보세요.)

필드가 부족 echo "$line" | cut -f1하면 마지막으로 찾은 필드를 재사용하므로 etc를 사용하지 않습니다 .cut

"${middle:-x}" 대신 x변수가 구성에 설정되지 않은 경우 실제로 변수에 할당할 수 있습니다 ${middle:=x}. :다른 명령의 부작용이 아닌 자체적으로 할당이 발생하도록 하려면 앞에 no-op 명령을 붙입니다.

: ${middle:=x}
echo "The middle is $middle"    # Will be 'x' if it was unset

답변2

이 시도:

내용이 "file" 파일에 저장되어 있다고 가정합니다.

cat file | sed -E 's/    /        x/'

줄게

CHrIS   john    xherzog  10001   Marketing
tim     x         johnson 10002   IT
ruth    xbertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

sed이렇게 적혀 있는지는 다음을 참고하세요.이것

답변3

파일이 처음부터 탭으로 구분되어 있다고 가정합니다.

$ cat -t file
CHrIS^Ijohn^Iherzog^I10001^IMarketing
tim^I^Ijohnson^I10002^IIT
ruth^Ibertha^IHendric^I10003^IHR
christ^Ijason^Ihellan^I10004^IMarketing

작업이 x열 2의 빈 필드에 삽입하는 것이라고 가정합니다.

$ awk -F'\t' 'BEGIN { OFS = FS } $2 == "" { $2 = "x" } { print }' file
CHrIS   john    herzog  10001   Marketing
tim     x       johnson 10002   IT
ruth    bertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

스크립트 awk는 탭 문자를 입력 및 출력 구분 기호로 사용하고 열 2의 빈 필드를 감지하여 로 변경합니다 x.

답변4

"sed"가 "\t" "\n" 이스케이프 시퀀스를 이해한다고 가정합니다. 그렇지 않다면 WA가 있습니다. 그러나 이는 코드의 논리에 해를 끼칠 것입니다.

 sed -e '
    s/\t/\n/;      # 1st field sep => \n , a char sure to not be in PS by definition
    s/\n\t/\tx\t/; # incase 2nd field empty then we will see the \n\t else not
    s/\n/\t/;      # just incase 2nd fields was nonempty, preceding would fail so deal here
' yourfile

진주

perl -F"\t" -pale '$F[1] || s/^\S+\t(?=\t)/$&x/' yourfile

관련 정보