데이터베이스에서 데이터를 추출하여 csv 파일에 로드하는 스크립트를 만들었습니다. 저는 SunOS hstz1454 5.10 시스템을 사용하고 있습니다. csv 파일의 숫자를 문자열로 변환/변환할 수 있는 방법이 있습니까? 따라서 여섯 번째 열이 숫자이면 1
이를 문자열로 변환하고 Cos4
, 2
여섯 번째 열에 숫자가 있으면 다른 문자열로 변환합니다 Cos6
. 마지막 문자를 문자열로 변환하기 전에 스크립트를 사용했습니다. 아마 제가 하고 싶은 일과 비슷할 것 같아요.
for fname in conv2015_10_TrafficProfile_data_migration.csv
do
echo "Translate each char to a string $fname"
sed s'/S$/STANDARD/g; s/C$/CUSTOMER/g; $fname > tmp.tmp
mv tmp.tmp $fname
done
내 데이터는 다음과 같습니다.
4,2,64,1088,80,1,Y,Y
5,2,64,1088,95,2,Y,Y
6,2,1088,39813120,0,2,Y,Y
7,2,1088,39813120,5,1,Y,Y
8,2,1088,39813120,10,2,Y,Y
답변1
당신은 이상한 것을 원합니다. 내 생각에는 간단한 교체 sed -e 's/this/that'
외에 awk 대신 sed를 사용할 이유가 거의 없습니다 (awk보다 훨씬 복잡하지는 않습니다 ). 이 경우 특히 비생산적입니다.
를 사용하여 awk에 를 구분 기호로 사용하도록 지시할 수 있습니다 . 위치 필드를 재그룹화하는 명령이 이를 쉼표와 결합 하도록 awk의 변수(출력 필드 구분 기호) -F,
에 쉼표를 넣을 수도 있습니다 .OFS
print
awk -F, 'BEGIN { OFS="," } ...'
이제 논리를 고수합시다. Awk는 위치 필드 변수 $1
, , ... 에 대한 $2
할당을 허용하기 때문에 일종의 "반응형 프로그래밍"을 지원합니다 . 이러한 변수에 값을 할당하면 $0
원래 입력 행을 보유했던 변수가 자동으로 재구성됩니다. 위치 필드와 OFS
그 사이의 위치 필드를 결합하여 재구성합니다. 그래서 우리는 이렇게 할 수 있습니다:
awk -F, 'BEGIN { OFS="," }
{ if ($6 == 1) $6 = "Cos4"
else if ($6 == 2) $6 = "Cos6"
print }' yourfile
다시 컴파일할 필요가 없습니다. 6개월 후에 다시 방문하면 거의 즉시 무엇을 하는지 이해하게 될 것입니다.
위의 코드는 조건부 테스트를 별도의 awk 규칙으로 나누어 약간 단순화할 수 있습니다. 즉 말하자면:
awk -F, 'BEGIN { OFS="," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
{ print }' yourfile
{ print }
또한 다음과 같이 대체하여 "골프 코딩"을 수행할 수 있습니다 1
.
awk -F, 'BEGIN { OFS="," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
1' yourfile
이 상수는 1
부울 진리 조건으로 작동합니다. 이 조건에는 작업이 없으므로 Awk는 기본 작업인 을 제공합니다 { print }
. 그러나 이제 6개월 후에 다시 방문한다면 이 점을 기억해야 합니다. 이런 식으로 계획을 짧게 삭감하면 때로는 미래의 빚이 생길 수 있습니다.
반면 에 블록 OFS
에 설정하는 것이므로 해당 옵션을 피하고 동일한 블록에 설정하는 것이 좋은 변환입니다.BEGIN
-F
FS
awk 'BEGIN { FS = OFS = "," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
{ print }' yourfile
C 언어처럼 복합 할당을 사용할 수 있습니다. 가능하다면 유사하고 관련된 일은 비슷한 방식으로 밀접하게 함께 이루어져야 합니다.
답변2
sed -e's/,/&Cos\n/5' \
-e's/\n1/4/' \
-e's/\n2/6/' \
-e's/Cos\n//' <in >out
하지만 난 아직도 이해가 안 돼요 awk
.