gpt4 book ai didi

linux - 一个 sed diff 结果 :sed: -e expression #1, 字符 4:未终止的 `s' 命令

转载 作者:太空狗 更新时间:2023-10-29 11:29:38 28 4
gpt4 key购买 nike

这里是 r 2 个文件

------------文件a------------

1,2,3
2,xx,yy
3,lllll,ddd

------------文件b----------------

8,55
9,555
100,5555

我想要的结果是:文件a----------------

8,2,3
9,xx,yy
100,lllll,ddd

所以 bash 是:

#!/bin/bash
for i in $(seq 3)
do
q=`awk -v aa=$i -F , 'NR==aa{print $1}' a`
qq=`awk -v aa=$i -F , 'NR==aa{print $1}' b`
sed -i "s/^$q/$qq/g" a
done

这里没有错误

但如果发生错误:

#! /bin/bash
for i in $(seq 3)
do
q=`awk 'BEGIN {FS=","} NF!=1{print $1}' a`
qq=`awk 'BEGIN {FS=","} NF!=1{print $1}' b`
sed -i "s/^$q/$qq/g" a
done

这里有错误

sed: -e expression #1, char 4: unterminated `s' command

这个错误是怎么发生的?


感谢@EdMorton 当awk 执行时q 有3 行,所以sed 发生错误。q 应该split执行sed,所以

#! /bin/bash
q=`awk 'BEGIN {FS=","} {print $1}' a`
qq=`awk 'BEGIN {FS=","} {print $1}' b`
for ((i=1;i<=3;++i))
do
a=`echo $q | cut -d" " -f $i`
aa=`echo $qq | cut -d" " -f $i`
sed -i "s/^$a/$aa/g" a
echo $a
done

这样错误就消失了我在这里使用 cut 将 q 分成 3 个字段但它是多余的感谢@user000001,答案很明确**但是如果每个文件的字段和行都不同,粘贴是不合适的

#! /bin/bash
so i vi a bash:
len1=`awk -v x=1 -F, '{if(NR>x){x=NR}}END{print x}' a`
len2=`awk -v x=1 -F, '{if(NR>x){x=NR}}END{print x}' b`
if ((len1>len2))
then
((yy=2*len2))

else
((yy=len1+len2))
fi
q=`awk -v begin="$len2" -v end="$yy" 'BEGIN{FS=OFS=",";ORS="\n";}{if(NR<=end-begin) {arr[FNR]=$1;next}else if(NR>begin&&NR<=end){$1=arrFNR];print $0}}' b a`
echo $q

顺便说一句,如果上述 bash 的结果:8,2,3,7,4 9,xx,yy 100,lllll,ddd 1000,aloha,ee没有 "\n"为什么?


@EdMorton 超过 2 个文件怎么办(或者我不知道我有多少文件):

----文件a------------文件b------------文件c------------

1,2,3,4,7------------8,55------------99,3$

2,xx,yyd----------------9,5555------------999​​,43

3,lllll,ddd------------100,5555--------999​​9,533

4,阿罗哈,ee------------1000,77

------------------------10000,567

*****我想要的结果是:

----文件a------------文件b------------文件c----------

8,2,3,4,7------------99,55------------99,3$

9,xx,yyd----------------999​​,5555------------999​​,43

100,lllll,ddd------------999​​9,5555--------999​​9,533

1000,阿罗哈,ee--------1000,77

------------------------10000,567

什么是最短的 bash/awk/... 命令?

最佳答案

只需使用 awk:

$ awk 'BEGIN{FS=OFS=","} NR==FNR{a[NR]=$1;next} {$1=a[FNR]} 1' b a
8,2,3
9,xx,yy
100,lllll,ddd

当您使用带有双引号的 sed 时,您会招来鼻音恶魔,因为脚本中的 shell 变量在 sed 执行之前会被扩展,因此存储在这些变量中的任何字符都会成为您脚本的一部分。 Awk,如果使用得当,不会有这个问题。第二个脚本中使用的 awk 命令会产生多行输出,因此 sed 会看到换行符和阻塞符。

关于linux - 一个 sed diff 结果 :sed: -e expression #1, 字符 4:未终止的 `s' 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18718088/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com