Unix命令删除字段中的换行符



编辑:感谢大家回答问题,所有答案都有效。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

相关内容

  • 没有找到相关文章

最新更新