파일을 한 줄씩 읽는 스크립트를 작성하려고 합니다. 백슬래시(\)를 쉼표(,)로 바꿔야 합니다.
입력 파일은 다음과 같습니다.
1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5
내가 작성한 코드는 다음과 같습니다.
#!/bin/bash
cat $1 | while read -r line
do
ln=$(echo $line | xargs | sed 's/\\/,/g' )
echo $ln
done
echo Done!
실행하면 ./script.sh file.csv
다음과 같은 결과가 나타납니다.
1,2,3,WORKSTATION1A,5
1,2,3,WORKSTATION2B,5
1,2,3,WORKSTATION1C,5
1,2,3,WORKSTATION1D,5
1,2,3,WORKSTATION1E,5
1,2,3,WORKSTATION1F,5
1,2,3,WORKSTATION1G,5
Done!
그러나 출력은 다음과 같을 것으로 예상됩니다.
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
Done!
sed 's/\\/,/g'
또한 교체를 사용해 보았지만 tr "\\" ","
도움이 되지 않았습니다. 수정이 필요합니까?
답변1
이거 해봤어?
# cat a.txt
1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5
# sed -e 's/\\/,/g' a.txt
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
답변2
시도한 것과 동일한 스크립트를 작성하는 더 좋은 방법은 다음과 같습니다.
#!/bin/bash
while read -r line
do
echo "$line" | sed 's/\\/,/g'
done < "$1"
echo Done!
물론 모든 것을 다음과 같이 단순화할 수 있습니다.
#!/bin/bash
tr '\\' , < "$1"
답변3
다음으로 푸시할 때 쉘이 백슬래시를 먹지 않는지 확인하십시오 sed
.
sed 's/\\/,/g' <<\BS
1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5
BS
#OUTPUT#
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
답변4
여기에 awk 솔루션이 있습니다.
$ awk -F'\' '{print $1","$2}' file.txt
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5