AWK编程语言在Shell中的文本处理详解

需积分: 9 0 下载量 14 浏览量 更新于2024-10-05 收藏 147KB DOC 举报
"AWK是一种强大的文本处理工具,由Alfred Aho、Peter Weinberger和Brian Kernighan创建,主要用于处理文本数据,如输入文件的排序、数据处理、计算和报表生成。它拥有自己独特的语法,尽管在某些方面类似于Shell编程。在AWK中,程序基于模式匹配工作,扫描文件的每一行寻找匹配的模式,并在找到匹配时执行相应的动作。每个输入行被分为记录和字段,字段默认由空格或制表符分隔,但可自定义分隔符。" AWK简介: AWK是为文本处理而设计的一种编程语言,它提供了简单的方法来处理和分析结构化文本数据。AWK程序由模式(pattern)和动作(action)组成,例如`awk '{pattern+action}'`,其中模式定义了要匹配的文本,而动作是在匹配时执行的操作。这种模式-动作的结构使得AWK在处理大量文本数据时特别高效。 了解字段: 在AWK中,数据被分为记录和字段。记录通常代表文本文件中的一行,而字段是记录内的子字符串,由字段分隔符分隔。默认情况下,字段分隔符是空格或制表符,但可以通过设置`FS`内置变量来改变这个分隔符。例如,如果一个文件的字段以逗号分隔,可以使用`FS=','`来设置新的分隔符。在上面的示例中,员工列表文件中的字段由竖线(`|`)分隔。 使用模式: 模式是AWK中查找和匹配文本的关键部分。模式可以是正则表达式,也可以是简单的文本字符串。例如,`/DULANEY/`会匹配包含"DULANEY"的行。如果模式匹配成功,AWK会执行与之关联的动作。 花括号和字段分隔符: 花括号({})用于包围一组相关的动作,这样当模式匹配时,所有这些动作都会被执行。同时,`$0`代表整个记录,`$1`、`$2`等代表记录中的第一个、第二个字段,以此类推。 添加文本: 在AWK中,可以使用`print`命令打印输出,或者使用`printf`进行格式化输出。例如,`print $1, $2`会打印出当前行的第一个和第二个字段。 数学操作: AWK支持基本的数学运算,包括加减乘除以及比较操作。可以赋值给变量并进行计算,如`sum += $1`会累加每个记录的第一个字段到变量`sum`。 BEGIN和END: `BEGIN`和`END`块分别在处理输入之前和之后执行,不依赖于输入数据。`BEGIN`常用于设置变量或初始化,而`END`则常用于总结或输出最终结果。 输入、输出和源文件: AWK可以从标准输入、文件或其他来源获取数据,并能重定向输出到文件或标准输出。通过`<`操作符指定输入文件,如`awk 'pattern{action}' input_file`,而`>`用于指定输出文件。 处理错误: AWK没有内置的错误处理机制,但可以使用条件语句检查可能的错误情况,如空字段、无效的模式匹配等。 结论: AWK是Unix/Linux环境中强大的文本处理工具,其灵活性和简洁性使其成为数据处理和分析的理想选择。通过理解和掌握AWK的基本概念和语法,用户可以编写出高效且易于维护的脚本来处理各种文本数据任务。

以下shell脚本是什么意思,转成python是什么样的: if [ -s "${UUT_SN[itemloop]}_level3_item.txt" ] ; then format_error_line=() invalid_error_line=() line_count=0 while read itemline do ((line_count++)) if ! grep -iE "^[.+][ ]{1,}pass .+|^[.+][ ]{1,}fail .+" <<<"$itemline" ; then format_error_line[${#format_error_line[@]}]="$line_count" fi #检查三层记录文件里是否有不可识别的符号 line_mark_count=$(awk -F "" '{print NF}' <<<"$itemline") for((line_mark_loop=0;line_mark_loop<line_mark_count;line_mark_loop++)) do line_mark_ascii=$(echo "${itemline:line_mark_loop:1}" | awk 'BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{print a[$0]}') if ! [[ ${line_mark_ascii} -ge 32 && ${line_mark_ascii} -le 126 ]] ; then invalid_error_line[${#invalid_error_line[@]}]="$line_count" continue 2 fi done done <"${UUT_SN[itemloop]}_level3_item.txt" if [ "0" != "${#format_error_line[@]}" ] ; then mv ${UUT_SN[itemloop]}_level3_item.txt ${UUT_SN[itemloop]}_level3_item.old echo "[level3_format] Fail $(date +"%y-%m-%d %H:%M:%S") format error,please check ${UUT_SN[itemloop]}_level3_item.old in line:${format_error_line[@]}" | tee "${UUT_SN[itemloop]}_level3_item.txt" fi if [ "0" != "${#invalid_error_line[@]}" ] ; then [ ! -s ${UUT_SN[itemloop]}_level3_item.old ] && mv ${UUT_SN[itemloop]}_level3_item.txt ${UUT_SN[itemloop]}_level3_item.old echo "[level3_invalid_word] Fail $(date +"%y-%m-%d %H:%M:%S") content invalid word,please check ${UUT_SN[itemloop]}_level3_item.old in line:${invalid_error_line[@]}" | tee "${UUT_SN[itemloop]}_level3_item.txt" fi fi

2023-05-24 上传

用Python改写以下代码for i in $(ls ${contact_dir});do #temp: 1acb_E-by #temp1: 1acb_E temp=$(echo ${i%-*}) temp1=$(echo ${temp%-*}) awk '{if(!a[$6]++) print $6}' ${contact_dir}/${i} >${contact_dir}/${temp}-res.txt for j in $(cat ${contact_dir}/${temp}-res.txt);do cat ${contact_dir}/${temp}-res.vor | awk '$6=='$j'{print $0}' >${patch_dir}/${temp}_patch_${j}.txt value=0 for l in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do #echo $l res=$(awk '{print $2}' ${surface_dir}/${temp1}_surface.txt) #echo $res if ( echo ${res} | grep -q $l);then value=1 fi done #patch_abs for k in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do cat ${rsa_dir}/${temp1}_abs.txt | awk '$3=='$k'{print $0}' >>${patch_abs_dir}/${temp1}_patch_${j}.txt done for m in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do for n in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do if [ $n -ne $m ];then cat ${contact_dir}/${temp}-res.vor | awk '$2=='$m' && $6=='$n' {print $0}' >>${patch_contact_dir}/${temp1}_patch_${j}.txt fi done done #### abs=$(awk '{sum += $4};END {print sum}' ${patch_abs_dir}/${temp1}_patch_${j}.txt) con=$(awk '{sum += $9};END {print sum}' ${patch_contact_dir}/${temp1}_patch_${j}.txt) psaia=$(echo "$abs*$con" | bc) echo $j $abs $con $psaia >>${patch_psaia_dir}/${temp1}.txt #echo $j $con >>${patch_psaia_dir}/${temp1}_con.txt #### #echo $value if [ $value = 0 ];then #echo ${patch_dir}/${temp}_patch_${j} rm ${patch_dir}/${temp}_patch_${j}.txt fi done done

2023-05-15 上传
2023-05-25 上传