0

field1;field2;field3 を 1 行に含むテキスト ファイルがあります。以下の例のように、3 つのフィールドのみを含む別のファイルを作成する必要があります。

オリジナル:

yast2-storage-lib;2.13.108-0.4.226;
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage-lib;2.13.112-0.6.1;
yast2-storage;2.13.108-0.4.226;
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1

望ましい結果:

yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1

誰かが私を助けることができますか?数時間テストしてきましたが、期待どおりの結果が得られず、私のテキスト変換スキルはほとんどありません。「grep」、「awk」、「sed」で試しましたが、前述のとおり、exp が不足しています。

4

5 に答える 5

2

sed を使用して、で終わるすべての行を削除します;

sed '/;$/d'
于 2013-05-03T19:38:21.187 に答える
0

あなたは awk で正しい軌道に乗っています。awk $N はフィールドであるため、たとえばコマンドラインで最初と3番目のフィールドを出力するには、次のように入力します

awk '{print $1, $3}' <input file> > <output file>

特定の要件に応じて、これを行う他の方法があります。バージョンなどの行でパターンを検索し、特定のフィールドを出力する必要がある場合は、

awk '/pattern/ {print $1, $3}' <input file> > <output file>

ここここを参照することから始めます。その後、私は awk/gawk ワンライナーに目を通し、あなたがしなければならないことの多くが 1 行で達成できるようにします。猫がキーボードの上を歩いているように見えるかもしれませんが、面倒な作業を何時間も節約できます。

于 2013-05-03T19:24:22.937 に答える
0

これはどう?

$ cat yast 
yast2-storage-lib;2.13.108-0.4.226;
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage-lib;2.13.112-0.6.1;
yast2-storage;2.13.108-0.4.226;
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1
$ awk -F";" '{for(i=2;i<=NF;i++){if(!b[$i]&&$NF!=""){b[$i]=$i;if(length(s)>0){s=s";"$i}else{s=$i}}};a[$1]=$1";"s}END{for(i in a){print a[i]}}' yast 
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1
于 2013-05-03T20:11:53.580 に答える