
次のテキストファイルの「空白」列を埋めるようにAWKを取得しようとしています。
AWK NF を使用して最長行を見つけ、その列に値がない行を確認する基本的なアイデアです。次に、各空の列にx回N / Aを追加します。
この例にはスペースで区切られた入力がありますが、文字で区切られたファイルに簡単に変更できます。
入力は次のとおりです。
aaa bbb ccc ddd
aaa
aaa bbb ccc
hhh ppp uuu
www yyy hhh
hhh 111 333 yyy ooo hyy uuuioooy
そして、出力はファイルの最大列数を計算し、空の列にN / Aを追加します。
aaa bbb ccc ddd N/A N/A N/A
aaa N/A N/A N/A N/A N/A N/A
aaa bbb ccc N/A N/A N/A N/A
hhh ppp uuu N/A N/A N/A N/A
www yyy hhh N/A N/A N/A N/A
hhh 111 333 yyy ooo hyy uuuioooy
答え1
最も簡単な方法は、2つのステップで行うことです。まず、最も広い線を探します。
max=$(awk 'max < NF { max = NF } END { print max }' infile)
次に、別の列を埋めるときにそれを入力として使用します。
awk -v max=$max '{ for(i=NF+1; i<=max; i++) $i = "N/A"; print }' infile
答え2
awk 'FNR==NR{if(m<NF)m=NF;next}{for(i=NF;i<m;i++)$(i+1)="N/A"}1' tiny.txt tiny.txt
入力ファイル名は2回指定されます。
答え3
ファイルに不足しているフィールドがある行内のすべての列にフィールド区切り文字がある場合、欠落しているフィールドが行の終わりだけでなく行内にある場合も処理する別の良い解決策があります。たとえば、空白のセルがあるスプレッドシートです(正しい区切り文字を使用している場合)。
例えば。スペースで区切られたファイルの場合
aaa bbb ccc ddd ggg
aaa abb ccc
www yyy hhh
www yyy 333 yyy ooo hyy
あなたはそれを使用することができます
awk -F'[ ]' '{OFS=" ";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}' infile.txt
またはタブで区切られた場合:
awk -F'\t' '{OFS="\t";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}' infile.txt
DOS/Windows 生成ファイルに注意してください。 Excelでは、キャリッジリターンを削除する必要があります。
cat infile.txt | tr -d '\r' | awk -F'[ ]' '{OFS=" ";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}'
おそらく、これは問題に正確には合わないかもしれませんが、多くのユーザーにとって便利です。