Shell Scripting -awk选项需要帮助

时间:2014-02-14 16:22:42

标签: shell unix sunos

脚本应该读取路径中的每个文件并替换每一行中的字符串。如何在同一路径中迭代10个diff输入文件名时创建临时文件和mv替换 请咨询

SunOS 5.10

FILES=/export/home/*.txt
for f in $FILES
do
echo "Processing $f file..."
cat $f | awk 'BEGIN {FS="|"; OFS="|"} {$8=substr($8, 1, 6)"XXXXXXXXXX\""; print}'
done

输入文件

"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"2455525445552000"|"1111-11-11"|75.00|"XXE11111"|"224425" 
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"2455525445552000"|"1111-11-11"|95.00|"VVE11111"|"224425"

输出文件

"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"245552xxxxxxxxxx"|"1111-11-11"|75.00|"XXE11111"|"224425" 
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"245552xxxxxxxxxx"|"1111-11-11"|95.00|"VVE11111"|"224425"

不确定如何使用此

cat $f | awk 'BEGIN {FS="|"; OFS="|"} {$8=substr($8, 1, 6)"XXXXXXXXXX\""; print}' $f > tmp.txt && mv tmp.txt $f

1 个答案:

答案 0 :(得分:0)

要实现您期望的最终结果,您可以使用 ed 代替 awk

FILES=/export/home/*.txt
for f in $FILES; do
    echo "Processing ${f} file..."
    ed  "${f}" <<EOF
% s/\([0-9]\{6\}\)[0-9]\{10\}/\1xxxxxxxxxx/
w
q
EOF
done

这需要更少的步骤(即命令调用),因为您没有创建临时文件并移动它。相反,您正在使用所需的更改编辑文件,然后关闭它。

% means "operate on every line" (don't worry about lines that don't match)
s means "perform a substitution" -- /[pattern]/[replacement]/
w means write
q means quit
EOF closes out the "here document"

希望有所帮助。

编辑注意:Charles Duffy指出 ed $ {f} 会因文件名中包含空格而失败,并且 ed “$ {f}” 不会受到这种特殊缺陷的影响。这是真的。 然而,上面的 for 循环可能会分裂到文件名中的任何空格。你可以设置 IFS IFS='\n')来克服KSH,BASH,MKSH,ASH和DASH的这个限制。在ZSH中(取决于您的版本),您可能需要设置SH_WORD_SPLIT。作为替代方案,您可以从 for 循环更改为循环读取

FILES=/export/home/*.txt
ls ${FILES} | while read f; do
    echo "Processing ${f} file..."
    ed  "${f}" <<-EOF
% s/\([0-9]\{6\}\)[0-9]\{10\}/\1xxxxxxxxxx/
w
q
EOF
done

<击>

编辑注意:我上面的错误陈述受到了破坏,但仍然用于历史目的。请参阅Charles Duffy(下文)的评论以获得澄清。