0

次のようなファイルがあります。

Header1:value1|value2|value3|
Header2:value4|value5|value6|

列番号が不明で、列番号を返すことができる関数があります。

そして、ファイルから 1 列を削除できるスクリプトを書きたいと思います。たとえば、列 1 を削除すると、次のようになります。

Header1:value2|value3|
Header2:value5|value6|

私はcutこれを達成するために使用しており、これまでのところ、ヘッダーなしで1つの列を削除した後に値を与えることができます. 例えば

value2|value3|
value5|value6|

ヘッダーを元に戻す方法を誰か教えてもらえますか? または、任意のコマンドで直接実行できますか? ありがとう。

4

8 に答える 8

2

コロンをパイプにcut置き換え、コマンドを実行してから、最初のパイプを再びコロンに置き換えます。

sed 's/:/|/' input.txt | cut ... | sed 's/|/:/'

ヘッダーをカウントしないように、カット コマンドの列番号を調整する必要がある場合があります。

于 2012-07-06T14:24:12.897 に答える
1

問題は、HeaderX の後に「:」が続くことです。これは「| 」ではありません。' カットで使用する区切り文字。

最初に行を : で 2 つの部分に分け、「cut -f 1 --delimiter=: YOURFILE」のようにしてから、最初の列を削除してからヘッダーを元に戻すことができます。

于 2012-07-06T14:25:08.683 に答える
1

「:」を「|」に変換して、ヘッダーが最初のフィールドの一部ではなく、別のフィールドになるようにします。tr ':' '|'これは、最初にデータを生成するもので行うか、 beforeを介してデータを渡すことによって行うことができますcut。残りのフィールドは +1 オフセットされますが、それは簡単に補正できます。

于 2012-07-06T14:23:35.660 に答える
1

awk は複数の区切り文字を処理できます。したがって、別の代替手段は...

jkern@ubuntu:~/scratch$ cat ./data188 
Header1:value1|value2|value3|
Header2:value4|value5|value6|
jkern@ubuntu:~/scratch$ awk -F"[:|]" '{ print $1 $3 $4 }' ./data188 
Header1value2value3
Header2value5value6
于 2012-07-06T14:40:42.607 に答える
0

sedなしでそれを行うことができますcut

sed 's/:[^|]*|/:/' input.txt
于 2012-07-06T14:28:31.550 に答える
0

Perl の解決策を参考にしてください:
(必要に応じてフィールドの再配置/削除)

-l はすべての print ステートメントに効果的に改行を追加します
- 自動分割モードは -F 式を使用して各行を配列に分割します @F
-n は - の周りにループを追加しますe code
-e 「ワンライナー」はこのオプションの後に続きます

$ perl -F[:\|] -lane 'print "$F[0]:$F[1]|$F[2]|$F[3]"' input.txt
于 2014-01-14T03:48:01.283 に答える
0

私の解決策:

$ sed 's,:,|,' data | awk -F'|' 'BEGIN{OFS="|"}{$2=""; print}' | sed 's,||,:,'
Header1:value2|value3|
Header2:value5|value6|
  • :と置き換えます|
  • -F'|'シンボルをフィールドセパレータとしてawk使用するように指示します|
  • 各行で、2 番目 (ヘッダーが最初になるため) のフィールドを空の文字列に置き換え、結果の行を新しいフィールド セパレータ ( |)に置き換えます。
  • |firstを次のように置き換えてヘッダーを返します:

完璧ではありませんが、動作するはずです。

于 2012-07-06T14:29:27.200 に答える
0

$ cat file.txt | grep 'Header1' | awk -F"1" '{ print $1 $2 $3 $4}'

これにより、すべての値が別々の列に出力されます。任意の数の列を印刷できます。

于 2014-01-08T07:53:27.900 に答える