큰따옴표(")가 나올 때까지 세 번째 필드의 csv 행을 캡처하고 싶습니다.
more test
"linux02","PLD26","net2-thrift-netconf","net.driver.memory","2"
"linux02","PLD26","net2-thrift-netconf","net.executor.cores","2"
"linux02","PLD26","net2-thrift-netconf","net.executor.instances","2"
"linux02","PLD26","net2-thrift-netconf","net.executor.memory","2"
"linux02","PLD26","net2-thrift-netconf","net.sql.shuffle.partitions","141"
"linux02","PLD26","net2-thrift-netconf","net.dynamicAllocation.enabled","true"
"linux02","PLD26","net2-thrift-netconf","net.dynamicAllocation.initialExecutors","2"
"linux02","PLD26","net2-thrift-netconf","net.dynamicAllocation.minExecutors","2"
"linux02","PLD26","net2-thrift-netconf","net.dynamicAllocation.maxExecutors","20"
나는 이것을 시도했다
sed s'/,/ /g' test | awk '{print $3","$4","$5}' | sed s'/"//g'
,,
net2-thrift-netconf,net.driver.memory
net2-thrift-netconf,net.executor.cores
net2-thrift-netconf,net.executor.instances
net2-thrift-netconf,net.executor.memory
net2-thrift-netconf,net.sql.shuffle.partitions
net2-thrift-netconf,net.dynamicAllocation.enabled
net2-thrift-netconf,net.dynamicAllocation.initialExecutors
net2-thrift-netconf,net.dynamicAllocation.minExecutors
net2-thrift-netconf,net.dynamicAllocation.maxExecutors
,,
하지만 구문에 문제가 있습니다. 왜냐하면 이 구문은 ",,"도 인쇄하고 두 번째 구문은 우아하지 않기 때문입니다.
예상 출력:
net2-thrift-netconf,net.driver.memory,2
net2-thrift-netconf,net.executor.cores,2
net2-thrift-netconf,net.executor.instances,2
net2-thrift-netconf,net.executor.memory,2
net2-thrift-netconf,net.sql.shuffle.partitions,141
net2-thrift-netconf,net.dynamicAllocation.enabled,true
net2-thrift-netconf,net.dynamicAllocation.initialExecutors,2
net2-thrift-netconf,net.dynamicAllocation.minExecutors,2
net2-thrift-netconf,net.dynamicAllocation.maxExecutors,20
답변1
이것은 단지 문제인 것 같습니다. 따옴표를 제거하고 세 번째 필드부터 줄 끝까지 인쇄하십시오.
$ tr -d \" < file | cut -d, -f3-
net2-thrift-netconf,net.driver.memory,2
net2-thrift-netconf,net.executor.cores,2
net2-thrift-netconf,net.executor.instances,2
net2-thrift-netconf,net.executor.memory,2
net2-thrift-netconf,net.sql.shuffle.partitions,141
net2-thrift-netconf,net.dynamicAllocation.enabled,true
net2-thrift-netconf,net.dynamicAllocation.initialExecutors,2
net2-thrift-netconf,net.dynamicAllocation.minExecutors,2
net2-thrift-netconf,net.dynamicAllocation.maxExecutors,20
따라서 tr -d \"
세 번째부터 마지막 구분 필드까지 따옴표를 제거하고 인쇄하십시오.cut -d, -f3-
,
답변2
다음에만 해당 sed
:
sed -E 's/"//g; s/^([^,]*,){2}//' infile
s/"//g
, 큰따옴표를 모두 제거하세요.^([^,]*,){2}
, 구걸부터 시작하여 모든 항목을 삭제하고 쉼표를 붙이는 작업을 최대 두 번 반복합니다.
또는 다음을 사용하여 awk
:
awk -F\" '{$1=$2=$3=$4=$5=""}1' OFS="" infile
답변3
실제로는 CSV 데이터에 적합한 CSV 파서를 사용해야 합니다. Ruby를 사용하여 이를 수행하는 방법은 다음과 같습니다.
ruby -rcsv -e '
CSV.foreach(ARGV.shift) do |row|
wanted = row.drop(2) # ignore first 2 fields
puts CSV.generate_line(wanted, :force_quotes=>false)
end
' test
net2-thrift-netconf,net.driver.memory,2
net2-thrift-netconf,net.executor.cores,2
net2-thrift-netconf,net.executor.instances,2
net2-thrift-netconf,net.executor.memory,2
net2-thrift-netconf,net.sql.shuffle.partitions,141
net2-thrift-netconf,net.dynamicAllocation.enabled,true
net2-thrift-netconf,net.dynamicAllocation.initialExecutors,2
net2-thrift-netconf,net.dynamicAllocation.minExecutors,2
net2-thrift-netconf,net.dynamicAllocation.maxExecutors,20
아니면 한 줄로
ruby -rcsv -e 'CSV.foreach(ARGV.shift) {|r| puts CSV.generate_line(r.drop(2), :force_quotes=>false)}' test