![](/img/trans.png)
[英]sed: sed: -e expression #1, char 63: unterminated `s' command
[英]one sed diff result:sed: -e expression #1, char 4: unterminated `s' command
這里是r 2文件
--------------檔案--------------
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表達式#1,字符4:無終止的s命令
該錯誤如何發生?
當awk執行時,THX到@EdMorton q有3行,因此sed發生錯誤。 q應該拆分執行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個字段但是它的冗余和THX到@ 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
BTW,如果上述bash的結果:8,2,3,7,4 9,xx,yy 100,lllll,ddd 1000,aloha,ee沒有“\\ n”為什么?
@EdMorton大約2個以上的文件(或者我不知道我有多少個文件):
----文件-------------文件b -----------文件c ---------
1,2,3,4,7 -------------- 8,55 ------------- 99.3 $
2,XX,YYD --------------- ----------- 9,5555 999,43
3,LLLLL,DDD ------------ 100,5555 --------- 9999,533
4,阿羅哈,EE ---------- 1000,77
----------------------- 10000,567
** * * *我想要的結果是:
----文件---------------文件b -----------文件c ---------
8,2,3,4,7 -------------- 99,55 ------------- 99.3 $
9,XX,YYD --------------- 999,5555 ---------- 999,43
100,LLLLL,DDD ---------- --------- 9999,5555 9999,533
1000,阿羅哈,EE -------- 1000,77
----------------------- 10000,567
waht是最短的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可以看到換行符和扼流圈。
可以使用cut
and paste
代替awk。 例如:
$ paste -d, <(cut -d, -f 1 fileb) <(cut -d, -f 2- filea)
8,2,3
9,xx,yy
100,lllll,ddd
給出您想要的結果。
只需調用awk
達到目的:
$ awk 'NR==FNR{a[NR]=$2FS$3;next}{print $1,a[FNR]}' FS=, OFS=, file1 file2
8,2,3
9,xx,yy
100,lllll,ddd
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.