다음 예와 유사하게 LDIF(텍스트) 파일의 빈 줄 사이에 있는 텍스트 블록에서 선택한 속성을 쉼표로 구분된 구분 기호가 있는 CSV 파일로 변환해야 합니다.
예:
LDIF 파일(입력):
<Blank Line>
AA: User11_Value1
BB: User11_Value2
CC: User11_Value3
DD: User11 Space Value4
<Blank Line>
AA: User22_Value1
BB: User22_Value2
CC: User22_Value3
DD: User22 Space Value4
<Blank Line>
CSV 형식으로 변환합니다(출력).
AA,BB,DD
User11_Value1,User11_Value2,User11 Space Value4
User22_Value1,User22_Value2,User22 Space Value4
답변1
밀러(http://johnkerl.org/miller/doc) sed는 매우 짧고 간단합니다.
sed 's/://g' input.txt | mlr --x2c cut -x -f CC
당신을 위한
AA,BB,DD
User11_Value1,User11_Value2,User11 Space Value4
User22_Value1,User22_Value2,User22 Space Value4
Whit sed :
기본 밀러 입력 형식(XTAB) 중 하나를 얻기 위해 삭제한 다음 XTAB를 CSV로 변환하고 --x2c
마지막으로 CC
cut을 사용하여 필드를 삭제했습니다.
답변2
STDIN에서 LDIF를 읽어서 CSV로 출력하는 스크립트입니다.
#!/bin/bash
#
# Converts LDIF data to CSV.
# Doesn't handle comments very well. Use -LLL with ldapsearch to remove them.
#
# 2010-03-07
# [email protected]
#
# Show usage if we don't have the right params
if [ "$1" == "" ]; then
echo ""
echo "Usage: cat ldif.txt | $0 <attributes> [...]"
echo "Where <attributes> contains a list of space-separated attributes to include in the CSV. LDIF data is read from stdin."
echo ""
exit 99
fi
ATTRS="$*"
c=0
while read line; do
# Skip LDIF comments
[ "${line:0:1}" == "#" ] && continue;
# If this line is blank then it's the end of this record, and the beginning
# of a new one.
#
if [ "$line" == "" ]; then
output=""
# Output the CSV record
for i in $ATTRS; do
eval data=\$RECORD_${c}_${i}
output=${output}\"${data}\",
unset RECORD_${c}_${i}
done
# Remove trailing ',' and echo the output
output=${output%,}
echo $output
# Increase the counter
c=$(($c+1))
fi
# Separate attribute name/value at the semicolon (LDIF format)
attr=${line%%:*}
value=${line#*: }
# Save all the attributes in variables for now (ie. buffer), because the data
# isn't necessarily in a set order.
#
for i in $ATTRS; do
if [ "$attr" == "$i" ]; then
eval RECORD_${c}_${attr}=\"$value\"
fi
done
done
여기를 클릭하세요더 알아보기