次の形式のファイルがあります。
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
を簡単に使用できますcut
。
cut -d'|' -f1-2,4- file
これはうまくいくかもしれません(GNU sed):
sed 's/[^|]*|//3' file
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
考えられる sed ソリューションは次のとおりです。
sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;'
これはあなたの例ではうまく機能し、他の例では調整できますが、実際には汎用ソリューションではありません。
説明:
-i.bak
その場でファイルを編集し、最初に というバックアップを作成しfilename.bak
ます。
\(^.*|.*|\)
行頭から 2 番目の区切り文字までをすべて一致させます。この一致の括弧グループ (グループ 1)。
.*|
最後の区切り文字を含め、すべてを一致させます。
\(.*\)
残りとグループを一致させます (グループ 2)。
\1\2
以前の一致をすべてグループ 1 とグループ 2 のテキストに置き換えます。
使用cut
するのが正しい答えですが、本当に使用したい場合はawk
、Kent が示すよりも簡単です。
awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}'
ダウン後にフィールドをシャッフルし$3
、値をNF
変更してフィールドの数を変更します。