shell 在Linux上使用sed/awk将字符串列表转换为单行

mec1mxoz  于 2023-01-17  发布在  Shell
关注(0)|答案(6)|浏览(143)

我有一个文件test.txt,其中包含作为值/字符串列表的数据,中间还有一些空行,如下所示

Val1  
Val2  
Val3

Val4  
Val5         
         
     
    
Val6

所需输出:

Val1, Val2, Val3  
Val4, Val5  
Val6

我正在使用下面的命令,但是它在一行中返回所有可用的值。但是我只想将连续的值连接在一起(逗号分隔),并且当它遇到空行时(可以有多个连续的空行),应该开始一个新行。
cat test.txt | sed 's/<[^>]*>//g' | sed 's/ //g' | sed 's/.*/&/;$!s/$/, /' | tr -d '\n'

uinbv5nw

uinbv5nw1#

我想这就是你想做的,使用任何awk:

$ awk -v RS= -F'\n' -v OFS=', ' '{$1=$1} 1' test.txt
Val1, Val2, Val3
Val4, Val5
Val6
mpbci0fu

mpbci0fu2#

使用gnu-sed可以读取整个文件
在围绕单个换行符的2个捕获组中捕获2个非换行符,并在替换中使用2个反向引用,中间使用,
然后用一个换行符替换两个或多个换行符。

sed -Ez 's/([^\n])\n([^\n])/\1, \2/g;s/\n{2,}/\n/g' file

产出

Val1, Val2, Val3
Val4, Val5
Val6

只使用sed -E,您可以使用阅读所有行的标签来完成相同的操作:

sed -E ':a;$!{N;ba};s/([^\n])\n([^\n])/\1, \2/g;s/\n{2,}/\n/g' file
jq6vz3qz

jq6vz3qz3#

***第一个解决方案:***仅使用显示的示例,请尝试以下GNU awk代码。

awk -v RS=  'RT{gsub(/\n/,", ");print}'  Input_file

***第二个解决方案:***使用GNU awk和您展示的示例,请尝试以下awk代码。

awk -v RS='([^\n]*\n)+' '
RT && num=split(RT,arr,"\n\n"){
  val=""
  for(i=1;i<=num;i++){
     sub(/,$/,"",arr[i])
     gsub(/\n+/,", ",arr[i])
     print arr[i]
  }
}
'  Input_file
yptwkmov

yptwkmov4#

这可能对您有用(GNU sed):

sed ':a;N;s/\n$//;t;s/\n/, /;ta' file

追加以下行,如果该行为空,则删除并打印结果。
否则,将换行符替换为,并重复。

vxbzzdmp

vxbzzdmp5#

GNU/BSD ed是否可用/可接受。

ed -s file.txt <<-'EOF'
  ,$-1g/.\{1,\}/;/^$/-1s/$/, /
  ,$-1g/.\{1,\}/;/^$/j
  g/^$/d
  %s/, *$//
  %p
  Q
EOF

在一行中,类似于:

printf '%b\n' ',$-1g/.\{1,\}/;/^$/-1s/$/, /' ',$-1g/.\{1,\}/;/^$/j' 'g/^$/d' '%s/, *$//' %p Q | ed -s file.txt
nnvyjq4y

nnvyjq4y6#

试试这个:

awk '{if(NF){if(line!="")line=line", "$0;else line=$0;}else{if(line!=""){print line;line=""} } } END{if(line) print line}' test.txt

输出:
确认1、确认2、确认3
瓣膜4、瓣膜5
Val6

相关问题