如何通过unix命令连接行

时间:2017-08-09 14:40:09

标签: regex unix

我有下一个文件myfile.txt

window.ShowDialog()

我想在普通视图中执行此文件:

"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","va
  l2","va
  l3"
"field4","val1","val2","val3"

所以,我试图用下一个命令来做到这一点:

"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","val2","val3"
"field4","val1","val2","val3"

但有些不对劲。请帮助我,我不是unix命令的大师

3 个答案:

答案 0 :(得分:1)

试试这个:

filename=$1

while read -r line
do
   found=$found$(echo $line | grep '[^"]')
   if [[ -n $found && $found == *\" ]]; then
       echo $found;
       found=''
   fi
done < "$filename"
  1. 变量$found总是以这种方式附加到自身,您将加入“断行”。
  2. 然后检查$found是否为空(-n是否为空),然后检查$found是否以@Barmar建议的报价结尾
  3. 如果它以一个结尾的引号结束,那么你echo $found将变量设置为空

答案 1 :(得分:1)

sed 解决方案:

sed -Ez 's/[[:space:]]+//g; s/""/","/g; s/(([^,]+,){3})([^,]+),/\1\3\n/g; $a\\' myfile.txt
  • -z - 将输入视为由空(零)字符而不是换行符分隔的行

  • s/[[:space:]]+//g - 删除行之间/行内的空格

  • s/""/","/g - 分隔包裹/破坏的相邻字段

  • s/(([^,]+,){3})([^,]+),/\1\3\n/g - 在每个第4个字段设置换行符(记录分隔符)

  • $a\\ - 在内容的末尾附加最后一个换行符

输出:

"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","val2","val3"
"field4","val1","val2","val3"

答案 2 :(得分:0)

在不知道输入数量的字段的情况下,您可以使用FPATgensub来使用此gnu-awk解决方案:

awk -v RS= -v FPAT='("[^"]*"|[^,"]+),?' -v OFS= '{
      for (h=1; h<=NF; h++) $h = gensub(/([^"])\n[[:blank:]]*/, "\\1", "g", $h); } 1' file

"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","val2","val3"
"field4","val1","val2","val3"

要将更改保存回文件使用:

awk -i inplace -v RS= -v FPAT='("[^"]*"|[^,"]+),?' -v OFS= '{
       for (h=1; h<=NF; h++) $h = gensub(/([^"])\n[[:blank:]]*/, "\\1", "g", $h); } 1' file