编辑:感谢大家回答问题,所有答案都有效。Stack Overflow确实有一个很棒的社区。
接收平面文件作为源。在其中一个字段中,值被分隔成新行,但需要打断换行并将其合并为一个内容。
例如:文件如下:
PO,MISC,yes,"This
is
an
example"
PO,MISC,yes,"This
is
another
example"
在上面的例子中,数据被读取为9行,但我们需要将输入读取为单行,如下所示-
PO, MISC, yes, "This is an example"
PO, MISC, yes, "This is another example"
尝试使用以下语法,但未成功。有什么办法做到这一点吗?我还需要将文件内容打印到另一个文件中。
语法:
awk -v RS='([^,]+\,){4}[^,]+n' '{gsub(/n/,"",RT); print RT}' sample_attachments.csv > test.csv
仅使用您显示的示例,请尝试以下在GNUawk
中编写和测试的awk
。简单的解释是,将RS
设置为"n
,并将字段分隔符设置为,
。在主块中,用$NF中的空格全局替换新行。然后使用printf
打印当前行连同RT
的值。
awk -v RS=""n" 'BEGIN{FS=OFS=","} {gsub(/n/," ",$NF);printf("%s",$0 RT)}' Input_file
awk -F"," '
BEGIN{ getline; n=NF; print}
{ split($0,a,FS);
while(length(a)<=n){
s=$0;
getline;
$0=s " " $0;
split($0,a,FS);
}
print $0 }' sample_attachements.txt
BEGIN(....)
存储变量n
中的字段数- 当字段数(数组
a
的长度(不等于n时,读取另一行,并将其附加到输入 print $0
最终打印(修改的(输入行
我会按照以下方式利用GNUAWK
来完成这项任务,让file.txt
的内容是
field1, field2, field3, field4
PO,MISC,yes,"This
is
an
example"
然后
awk 'BEGIN{RS="";FPAT=".";OFS=""}{for(i=1;i<=NF;i+=1){cnt+=($i==""");if($i=="n"&&cnt%2){$i=" "}};print}' file.txt
给出输出
field1, field2, field3, field4
PO,MISC,yes,"This is an example"
假设:连续的换行符永远不会超过1个,"
永远不会嵌套,解释:我通知GNUAWK
多输入一段,即将空行之间的所有内容视为一行,字段模式为.
,即每个字符都是字段,输出字段分隔符为空字符串。然后我迭代字符,如果我遇到"
,我会将cnt
增加1,如果我在"
之外,则用于航位推算。。。"
或内部"
。。。"
,当我遇到换行符并且cnt是奇数时,我在内部,所以我把它换成空格符。所有字符处理后,我print
它们。
(在gawk 4.2.1中测试(
您可以使用此gnu-awk
解决方案:
awk -v RS='"[^"]*"' '{ORS = gensub(/n/, " ", "g", RT)} 1' file
field1, field2, field3, field4
PO,MISC,yes,"This is an example"
PO,MISC,no,"This is another example"
输入文件的位置:
cat file
field1, field2, field3, field4
PO,MISC,yes,"This
is
an
example"
PO,MISC,no,"This
is
another
example"
对于更新的问题,请使用此awk
:
awk -F, -v OFS=", " -v RS='"[^"]*"|n' '{
ORS = gensub(/n(.)/, " \1", "g", RT)
$1 = $1
} 1' file
field1, field2, field3, field4
PO, MISC, yes, "This is an example"
PO, MISC, no, "This is another example"
使用任何awk:
$ awk -v RS='"' -v ORS= '!(NR%2){gsub(/n/,OFS); $0=""" $0 """} 1' file
PO,MISC,yes,"This is an example"
PO,MISC,yes,"This is another example"
对于其他内容,请参阅使用awk高效解析csv的最健壮的方法是什么。
您的输入文件名假定为"文件";并且输出为"0";新文件">
#!/bin/sh -x
cp file stack
cat > ed1 <<EOF
1,4w f1
1,4d
wq
EOF
next () {
[[ -s stack ]] && main
end
}
main () {
ed -s stack < ed1
cat f1 | tr 'n' ' ' >> newfile
next
}
end () {
rm -v ./ed1
rm -v ./f1
rm -v ./stack
}
next
如果允许sed
,则
sed ':a
/^[^"]*("[^"]*"[^"]*)*$/b
N
s/n/ /
ba
' file