最後の2つの列が一部の行のブロック数と一致しないファイルがあります($3
3つのブロックがありますが2つのブロックがあります)。$4
ファイル全体をどのように回復できますか?ありがとう
私が持っているもの:
162 167 4,92,4 2,19
143 164 2,4 54,32
532 843 6,4,5 43,23,53
私が望むもの:
143 164 2,4 54,32
532 843 6,4,5 43,23,53
答え1
努力する
awk 'split($3,A,",") == split($4,B,",")'
男によるとawk
Split(s, a[, r[, seps] ]) 文字列 s を正規表現 r の配列 a と区切り文字配列 seps に分割し、フィールド数を返します。
- デフォルトのawkジョブは暗黙的な印刷です。
答え2
3番目と4番目のフィールドで、カンマで区切られた値の数が異なる行をフィルタリングするには、次の手順を実行します。
awk '{ nc3=split($3,a,","); nc4=split($4,a,",") } nc3 == nc4' data.in
このawk
関数は、split
正規表現の3番目の引数(この場合はカンマ)で指定されたフィールドを分割し、結果フィールドをa
2番目の引数(ここ)の配列に格納します。結果の配列を使用する代わりに、split
生成された配列項目の数を返す foct を使用します。
この数字(nc3
およびnc4
)が等しい場合、その行は印刷されます。
答え3
シンプルアッ方法:
awk -F"[[:space:]]+|," '!(NF%2){ print }' file
出力:
143 164 2,4 54,32
532 843 6,4,5 43,23,53
!(NF%2)
- 偶数の項目を含む行のみを考慮します(スペースを,
フィールド区切り文字として扱います)。