次のファイルがあります。
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
ここで、aを中間文字としてEX
挿入したい4桁の数字は常にです。/
答え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 =で始まることを確認して、指定された行の各フィールドを処理します。フィールドが見つかると、そのフィールドが適切な変数に割り当てられます。次に、サブコマンドを使用して変数の先頭を削除します。これはそのキーに関連する値を提供します。
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
ソリューションの1つのステップを実装しました。 :)
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