주어진 파일은 다음과 같습니다
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 IT
X로 어떻게 변경하나요?
답변1
이것이 {tab}
공백의 문자라고 가정하면 ...
또는 이미 필드 구분 기호로 사용되었기 때문에 awk
탭 문자는 표시 되지 않습니다 .tr
cut
빈 필드를 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