次のデータがあり、column1の重複エントリを別々のファイルに解析する必要があります。
例えば、
21288003132541:cr
21288003267289:fr
21288003758683:ph
21288003758683:tag
21288003758683:sel
この行を別のファイルにインポートしたいと思います21288003758683:tag
。必要な出力は、すべてのuniq行と重複した後続のファイル用の別々のファイルです。
たとえば、ファイル1
21288003132541:cr
21288003267289:fr
21288003758683:ph
ファイル2
21288003758683:tag
ファイル3
21288003758683:sel
これが意味があることを願っています。
ありがとう
答え1
#!/bin/bash
[ $# -ge 1 ] && [ -f "$1" ] || exit
while read oneline;do
for onecode in $oneline;do
let count=1
outfile="output.$count"
[ -f $outfile ] || touch $outfile
while grep "${onecode%:*}" $outfile >/dev/null;do
let count+=1
outfile="output.$count"
[ -f $outfile ] || touch $outfile
done
echo "$onecode" >>$outfile
done
done < "$1"
上記のコードを使用すると、見つかった重複項目の数に応じて、名前が出力1、出力2などの複数のファイルが生成されます。出力の行形式が重要なのか、それとも作業が終わったら元のファイルを置き換えたいのかわかりません。
答え2
辞書配列を使用するPythonのバージョンです。このバージョンでは出力順序は維持されません。
#!/usr/bin/env python
import fileinput
dics = []
for line in fileinput.input():
(a, _) = line.split(':')
for dic in dics:
if a not in dic:
dic[a] = line
break
else:
dics.append({a: line})
for i, dic in enumerate(dics):
with open('file%d.txt' % (i+1), 'w') as f:
for line in dic.values():
f.write(line)
答え3
ファイルをxxに保存し、次の手順を実行します。
touch mem; num=$(wc -l xx | awk '{print $1}');
for ((i=1 ; i<= $num ; i++ )) do
n=$(sed -n ''$i'p' xx );
nn=$(echo $n | awk -F":" '{print $1}')
grep "$nn" xx > xx1
jj=1; aa=$(grep "$nn" mem)
if [[ -z $aa ]] ; then
cat xx1 | while read n ; do
echo $n >> file$jj ;
jj=$(($jj+1)) ;
done ;fi
echo $nn >> mem;
done