パイプで区切られたファイルがあります。 28のフィールドがあります。最後の2つのフィールドを削除し、26のフィールドのみを印刷する必要があります。

パイプで区切られたファイルがあります。 28のフィールドがあります。最後の2つのフィールドを削除し、26のフィールドのみを印刷する必要があります。

パイプで区切られたファイルがあります。 28のフィールドがあります。最後の2つのフィールドを削除し、26のフィールドのみを印刷する必要があります。

これは最後の3(26、27、28)フィールドです。DC||0|

私が望む出力は|DC|

答え1

POSIX準拠のsedの場合:

sed 's/\([^|]*|\)\{2\}$//'

たとえば、

$ echo 'foo|DC||0|' | sed 's/\([^|]*|\)\{2\}$//'
foo|DC|

答え2

そして牛に似た一種の栄養奇妙な:

awk '{NF=NF-3; NF++}1' FS='|' OFS='|' file

これにより、最後の3つの列が削除され、空の列が追加されます。


望むより:8つの強力なawk組み込み変数 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

答え3

awk 'BEGIN{FS=OFS="|"} NF>2{NF-=2;$1=$1;print}'

awk変形の一部(すべてではない!)については省略できます$1=$1

行に3つ未満のフィールドがある場合、行はまったく印刷されません。これは、空のフィールドで始まる行と3つ未満のフィールドで始まる行の間に違いがあるかどうかを確認する唯一の方法です。

フィールド区切り文字(FS)が単一のスペースではない場合、各スペースはフィールドを区切って空の先行フィールドと末尾フィールドを切り捨てません。

このような行には、3つではなく4つのフィールド(、、、、)DC||0|があります。 =>に結合すると、最後の2つのフィールドが削除されます。DC<empty>0<empty>DC<empty>DC||

同様に、同じ行には1つではなく3つのフィールド(、、、)|DC|があります。最後の2つのフィールドを削除すると、つまり空白行がなくなります。<empty>DC<empty><empty>|

答え4

私はそれを使用してcut -d "|" -f 1-26 <filename>動作します。

関連情報