9

次の形式のファイルがあります。

col1|col2|col3|col4
a|b|c|d
e|f||h
i|j|k|l

ヘッダーとデータからも col3 (区切り文字「|」付き) を削除したいと考えています。これは awk/sed を使用して実行できますか?

col3 のデータは空である可能性があることに注意してください (行 2)。

出力は次のようになります。

col1|col2|col4
a|b|d
e|f|h
i|j|l
4

7 に答える 7

21

を簡単に使用できますcut

cut -d'|' -f1-2,4- file
于 2012-10-03T20:49:01.677 に答える
4

これはうまくいくかもしれません(GNU sed):

sed 's/[^|]*|//3' file
于 2012-10-03T22:28:59.937 に答える
0
awk  'BEGIN{FS=OFS="|"}{print $1,$2,$4}'   file

あなたに出力を与えるはずです。

これは非常に基本的なawkの使用法です。

編集

あなたは70列について言及しませんでした...:(

これを試して:

awk  -F'|' '{s="";for(i=1;i<=NF;i++){f=(NF==i)?"":FS;if(i!=3)s=s $i f;}print s}' file
于 2012-10-03T20:42:29.133 に答える
0

考えられる sed ソリューションは次のとおりです。

sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;'

これはあなたの例ではうまく機能し、他の例では調整できますが、実際には汎用ソリューションではありません。

説明:

-i.bakその場でファイルを編集し、最初に というバックアップを作成しfilename.bakます。

\(^.*|.*|\)行頭から 2 番目の区切り文字までをすべて一致させます。この一致の括弧グループ (グループ 1)。

.*|最後の区切り文字を含め、すべてを一致させます。

\(.*\)残りとグループを一致させます (グループ 2)。

\1\2以前の一致をすべてグループ 1 とグループ 2 のテキストに置き換えます。

于 2012-10-03T21:04:12.747 に答える
0

使用cutするのが正しい答えですが、本当に使用したい場合はawk、Kent が示すよりも簡単です。

awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}'

ダウン後にフィールドをシャッフルし$3、値をNF変更してフィールドの数を変更します。

于 2012-10-03T21:25:12.110 に答える