我在查找字符串中的模式时遇到问题。实际上我想比较两个文件并将file1的内容替换为具有以下内容的文件2
000123 moorsevi har NC asee terel
000125 staevil strd NC klass aklsd
000126 carolie asdr NC skdkld kaks
000128 histvil df NC lllas kasd
000123 moorsevile har NC asee terel
000125 staevile strd NC klass aklsd
000126 caroline asdr CA skdkld kaks
这里我必须匹配第一列并替换file2中的第2列和第3列,其中file2中行的长度不应更改。
我尝试过以下代码。
#! /bin/ksh
IFS=$
ite=0
while read -r line
do
seqno=$(echo $line|cut -c1-9)
add=$(echo $line |cut -c10-28)
state=$(echo $line|cut -c29-31)
echo "seq no:[$seqno] add:[$add] state:[$state]"
line1=$(grep $seqno file1)
add1=$(echo $line1|cut -c10-28)
state1=$(echo $line1|cut -c29-31)
echo "on file 1 address:[$add1]: state:[$state1]"
sed -e "s/$add/$add1/g" -e "s/$state/$state1/g" file2 |tee file2
ite=`expr $ite + 1`
echo "iteration= $ite"
done <file2
IFS="\n"
echo "IFS:[$IFS]"
000123 moorsevi har NC asee terel
000125 staevil strd NC klass aklsd
000126 carolie asdr NC skdkld kaks
本论坛的壳牌专家表示,使用awk是正确的方法
向我展示使用awk实现解决方案的一些亮点。
答案 0 :(得分:0)
您只是在分隔文本中提取字段。它是awk
的标准用例。例如
$ echo "123 moorsevile NC asee terel" | awk '{print $1,$2,$3}'
123 moorsevile NC
添加相关标签
... | awk '{print "seq no:"$1, "add:"$2, "state:"$3}'
seq no:123 add:moorsevile state:NC
或城市的初始上限
awk '{print "seq no:" $1,"add:" toupper(substr($2,1,1)) substr($2,2), "state:" $3}'
seq no:123 add:Moorsevile state:NC
或输出中的任意字段分隔符
awk -v OFS=" ~ " '{print "seq no:" $1,
"add:" toupper(substr($2,1,1)) substr($2,2) ,"state:" $3}'
seq no:123 ~ add:Moorsevile ~ state:NC
答案 1 :(得分:0)
很抱歉我现在已经更新了查询。我犯的错误是IFS被设置为空格(
while IFS= read -r line
)所以当我加载line
变量时具有多个空间,它将转换为一个。下面的代码按预期工作。
#! /bin/ksh
IFS=$
ite=0
while read -r line
do
#seqno=$(echo $line|awk '{print substr($0,1,6)}')
#add=$(echo $line |awk '{print substr($0,7,20)}')
#state=$(echo $line|awk '{print substr($0,21,23)}')
#echo "seq no:$seqno add:$add state:$state"
seqno=$(echo $line|cut -c1-6)
add=$(echo $line |cut -c7-20)
state=$(echo $line|cut -c21-23)
echo "seq no:$seqno add:$add state:$state"
ite=`expr $ite + 1`
echo "iteration= $ite"
done <file2
IFS="\n"
我的输出是
seq no:123 add:moorsevile state:NC
iteration= 1
seq no:125 add:staevile state:NC
iteration= 2
seq no:126 add:caroline state:CA
iteration= 3
感谢您的帮助。 如果我浪费你的时间,我真诚的道歉。
答案 2 :(得分:0)
鉴于您的新要求,这是您正在尝试做的事情:
$ cat tst.awk
BEGIN { FIELDWIDTHS="9 18 11 5" }
NR==FNR { f2[$1]=$2; f3[$1]=$3; next }
$1 in f2 { print $1 f2[$1] f3[$1] $4 $5 }
$ awk -f tst.awk file1 file2
000123 moorsevi har NC asee terel
000125 staevil strd NC klass aklsd
000126 carolie asdr NC skdkld kaks
对FIELDWIDTHS
使用GNU awk。
获取由Arnold Robbins撰写的Effective Awk Programming,4th Edition。