来自经过修改的文本的 AWK

来自经过修改的文本的 AWK

我有以下文件:

hello there. let's try&ACCT=1&bla bla bla&EX=1118&anything ss &SERIAL=1011&DEAL=NO
BLA BLA BLA&TOM=1&ACCT=2&LSLSLSLSL&none=1&EX=1218&lord=1&ok=1&SERIAL=201&flag=non

我需要从中提取 的字段值ACCT=EX=以便SERIAL= 输出变为:

1,11/18,1011
2,12/18,201

其中EX始终是一个 4 位数字,我想在其中插入 a/作为中间字符。

答案1

根据我放入名为 test.in 的文件中的示例输入,以下 awk 命令应该会为您提供所需的输出。

awk -F\& '{for (i=1; i<+NF; i++) {if ($i ~ /^ACCT=/) {acct=$i; sub(/^ACCT=/, "", acct)} if ($i ~ /^EX=/) {ex=$i; sub(/^EX=/, "", ex); sub(/^[0-9][0-9]/, "&/", ex)} if ($i ~ /^SERIAL=/) {serial=$i; sub(/^SERIAL=/, "", serial)}} printf("%s,%s,%s\n", acct, ex, serial)}' test.in

它的作用是将 & 视为字段分隔符。然后,它通过检查给定行中的每个字段是否以 ACCT=、EX= 或 SERIAL= 开头来处理该字段。如果找到该字段,则将该字段分配给适当的变量。然后使用 sub 命令删除该变量的开头。这只是为您提供与该键关联的值。

由于您需要在 EX 键的前 2 位数字后添加斜杠 (/),因此这是 EX 的另一个子键。与号 (&) 是一个反向引用,用于获取前 2 位数字。

处理完所有字段后,它会打印出该行中找到的值。

答案2

尝试使用以下方法,效果如预期良好

 k=`awk -F "&" '{print NF}' test.txt | sort | uniq| head -1`
for ((h=1;h<=$k;h++)); do awk -v h="$h" -F "&" '$h ~ /ACCT/ || $h ~ /EX/ || $h ~ /SERIAL/{print $h}' test.txt; done

输出

ACCT=1
ACCT=2
EX=1118
SERIAL=1011
EX=1218
SERIAL=201

答案3

使用sed&cat我实现了解决方案的一个阶段:)

sed 's/.*ACCT=\([0-9]*\).*/\1/' test > 1
sed 's/.*EX=\([0-9]*\).*/\1/' test > 2
sed 's/.*SERIAL=\([0-9]*\).*/\1/' test > 3

然后

paste 1 2 3

答案4

尝试了以下步骤,效果很好

 for i in {1..9}; do awk -v i="$i" -F "&" '$i ~ /ACCT/ || $i ~ /SERIAL/{print $i}' p_final.txt; done | awk -F "=" '{print $NF}' >final.txt

for i in {1..9}; do awk -v i="$i" -F "&" '$i ~ /EX/{print $i}' p_final.txt; done| awk -F "=" '{print $NF}'| awk '{print substr($1,1,2)"/"substr($1,3,2)}' >>final.txt


cat final.txt  | sed -n '1~2p' | tr "\n" ","| sed 's/,$//g' | sed  "s/.*/&\n/g"  >output.txt
 cat final.txt  | sed -n '2~2p' | tr "\n" ","| sed 's/,$//g' | sed  "s/.*/&\n/g"  >>output.txt


[root@praveen_linux_example ~]# cat output.txt
1,1011,11/18
2,201,12/18
[root@praveen_l

相关内容