我有一个包含
等行的文件a x1
b x1
q xq
c x1
b x2
c x2
n xn
c x3
我想测试每一行的第一个字段,如果有匹配,我想将匹配的行追加到第一行。输出应该看起来像
a x1
b x1 b x2
q xq
c x1 c x2 c x3
n xn
任何帮助将不胜感激
答案 0 :(得分:2)
使用awk
即可:
awk '{arr[$1]=arr[$1]?arr[$1] " " $0:$0} END {for (i in arr) print arr[i]}' file
n xn
a x1
b x1 b x2
c x1 c x2 c x3
q xq
答案 1 :(得分:1)
保留输入排序:
$ awk '
{
if ($1 in vals) {
prev = vals[$1] " "
}
else {
prev = ""
keys[++k] = $1
}
vals[$1] = prev $0
}
END {
for (k=1;k in keys;k++)
print vals[keys[k]]
}
' file
a x1
b x1 b x2
q xq
c x1 c x2 c x3
n xn
答案 2 :(得分:1)
我最终做了什么。 (Ed Morton和Jonte的答案显然更优雅。)
首先,我将输入文件的第一列保存在一个单独的文件中。
awk '{print $1}' input.file.txt > tmp0
然后使用行保存输入文件,这些行在$ 1字段处有重复值,已删除。
awk 'BEGIN { FS = "\t" }; !x[$1]++ { print $0}' input_file.txt > tmp1
然后使用重复的$ 1字段保存所有行。
awk 'BEGIN { FS = "\t" }; x[$1]++ { print $0}' input_file.txt >tmp2
然后保存了非重复文件(tmp1)的$ 1字段。
awk '{ print $1}' tmp1 > tmp3
我使用for循环从重复文件(tmp2)和重复删除文件(tmp1)中将行拉入输出文件。
for i in $(cat tmp3)
do
if [ $(grep -w $i tmp0 | wc -l) = 1 ] #test for single instance in the 1st col of input file
then
echo "$(grep -w $i tmp1)" >> output.txt #if single then pull that record from no dupes
else
echo -e "$(grep -w $i tmp1) \t $(grep -w $i tmp2 | awk '{
printf $0"\t" }; END { printf "\n" }')" >> output.txt # if not single then pull that record from no_dupes first then all the records from dupes in a single line.
fi
done
最后删除tmp文件
rm tmp* # remove all the tmp files